Answers:
假设您想要一个具有以下架构的数据框:
root
 |-- k: string (nullable = true)
 |-- v: integer (nullable = false)
您只需为数据框定义架构,然后使用empty即可RDD[Row]:
import org.apache.spark.sql.types.{
    StructType, StructField, StringType, IntegerType}
import org.apache.spark.sql.Row
val schema = StructType(
    StructField("k", StringType, true) ::
    StructField("v", IntegerType, false) :: Nil)
// Spark < 2.0
// sqlContext.createDataFrame(sc.emptyRDD[Row], schema) 
spark.createDataFrame(sc.emptyRDD[Row], schema)
PySpark等效项几乎相同:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType
schema = StructType([
    StructField("k", StringType(), True), StructField("v", IntegerType(), False)
])
# or df = sc.parallelize([]).toDF(schema)
# Spark < 2.0 
# sqlContext.createDataFrame([], schema)
df = spark.createDataFrame([], schema)
使用隐式编码器(仅限Scala),其Product类型如下Tuple:
import spark.implicits._
Seq.empty[(String, Int)].toDF("k", "v")
或案例类别:
case class KV(k: String, v: Int)
Seq.empty[KV].toDF
要么
spark.emptyDataset[KV].toDF从Spark 2.0.0开始,您可以执行以下操作。
让我们定义一个Person案例类:
scala> case class Person(id: Int, name: String)
defined class Person
导入sparkSparkSession隐式Encoders:
scala> import spark.implicits._
import spark.implicits._
并使用SparkSession创建一个空的Dataset[Person]:
scala> spark.emptyDataset[Person]
res0: org.apache.spark.sql.Dataset[Person] = [id: int, name: string]
你也可以使用一个模式“DSL”(见的DataFrames支持功能在org.apache.spark.sql.ColumnName)。
scala> val id = $"id".int
id: org.apache.spark.sql.types.StructField = StructField(id,IntegerType,true)
scala> val name = $"name".string
name: org.apache.spark.sql.types.StructField = StructField(name,StringType,true)
scala> import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructType
scala> val mySchema = StructType(id :: name :: Nil)
mySchema: org.apache.spark.sql.types.StructType = StructType(StructField(id,IntegerType,true), StructField(name,StringType,true))
scala> import org.apache.spark.sql.Row
import org.apache.spark.sql.Row
scala> val emptyDF = spark.createDataFrame(sc.emptyRDD[Row], mySchema)
emptyDF: org.apache.spark.sql.DataFrame = [id: int, name: string]
scala> emptyDF.printSchema
root
 |-- id: integer (nullable = true)
 |-- name: string (nullable = true)
spark.emptyDataset我的模块不存在,该如何使用?有一些(正确的)类似于(非正确的)val df = apache.spark.emptyDataset[RawData]?
                    spark是您使用的SparkSession.builder不属于org.apache.spark包的值。有两个spark名称在使用。这是spark你必须提供spark-shell开箱即用。
                    import scala.reflect.runtime.{universe => ru}
def createEmptyDataFrame[T: ru.TypeTag] =
    hiveContext.createDataFrame(sc.emptyRDD[Row],
      ScalaReflection.schemaFor(ru.typeTag[T].tpe).dataType.asInstanceOf[StructType]
    )
  case class RawData(id: String, firstname: String, lastname: String, age: Int)
  val sourceDF = createEmptyDataFrame[RawData]
在这里,您可以在Scala中使用StructType创建架构,并传递Empty RDD,以便能够创建空表。以下代码是相同的。
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql._
import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.types.BooleanType
import org.apache.spark.sql.types.LongType
import org.apache.spark.sql.types.StringType
//import org.apache.hadoop.hive.serde2.objectinspector.StructField
object EmptyTable extends App {
  val conf = new SparkConf;
  val sc = new SparkContext(conf)
  //create sparksession object
  val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
  //Created schema for three columns 
   val schema = StructType(
    StructField("Emp_ID", LongType, true) ::
      StructField("Emp_Name", StringType, false) ::
      StructField("Emp_Salary", LongType, false) :: Nil)
      //Created Empty RDD 
  var dataRDD = sc.emptyRDD[Row]
  //pass rdd and schema to create dataframe
  val newDFSchema = sparkSession.createDataFrame(dataRDD, schema)
  newDFSchema.createOrReplaceTempView("tempSchema")
  sparkSession.sql("create table Finaltable AS select * from tempSchema")
}
Java版本创建空的DataSet:
public Dataset<Row> emptyDataSet(){
    SparkSession spark = SparkSession.builder().appName("Simple Application")
                .config("spark.master", "local").getOrCreate();
    Dataset<Row> emptyDataSet = spark.createDataFrame(new ArrayList<>(), getSchema());
    return emptyDataSet;
}
public StructType getSchema() {
    String schemaString = "column1 column2 column3 column4 column5";
    List<StructField> fields = new ArrayList<>();
    StructField indexField = DataTypes.createStructField("column0", DataTypes.LongType, true);
    fields.add(indexField);
    for (String fieldName : schemaString.split(" ")) {
        StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
        fields.add(field);
    }
    StructType schema = DataTypes.createStructType(fields);
    return schema;
}
从Spark 2.4.3开始
val df = SparkSession.builder().getOrCreate().emptyDataFrame