如何在 Spark 中创建一个空的数据帧

Vin*_*mar 3 scala avro apache-spark apache-spark-sql spark-avro

我有一组基于 Avro 的配置单元表,我需要从中读取数据。由于 Spark-SQL 使用 hive serdes 从 HDFS 读取数据,因此比直接读取 HDFS 慢得多。所以我使用数据砖 Spark-Avro jar 从底层 HDFS 目录读取 Avro 文件。

一切正常,除非桌子是空的。我已设法使用以下命令从 hive 表的 .avsc 文件中获取架构,但出现错误“未找到 Avro 文件

val schemaFile = FileSystem.get(sc.hadoopConfiguration).open(new Path("hdfs://myfile.avsc"));

val schema = new Schema.Parser().parse(schemaFile);

spark.read.format("com.databricks.spark.avro").option("avroSchema", schema.toString).load("/tmp/myoutput.avro").show()
Run Code Online (Sandbox Code Playgroud)

解决方法:

我在该目录中放置了一个空文件,同样的事情也能正常工作。

有没有其他方法可以实现相同的目标?比如conf设置之类的?

小智 6

您不需要使用 emptyRDD。以下是 PySpark 2.4 对我有用的方法:

empty_df = spark.createDataFrame([], schema) # spark is the Spark Session
Run Code Online (Sandbox Code Playgroud)

如果您已经有来自另一个数据帧的架构,您可以这样做:

schema = some_other_df.schema
Run Code Online (Sandbox Code Playgroud)

如果不这样做,则手动创建空数据框的架构,例如:

schema = StructType([StructField("col_1", StringType(), True),
                     StructField("col_2", DateType(), True),
                     StructField("col_3", StringType(), True),
                     StructField("col_4", IntegerType(), False)]
                     )
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

  • 您可能应该添加需要导入的数据类型,例如“from pyspark.sql.types import StructType, StructField”,并且末尾的布尔值指示该列是否可为空 https://spark.apache.org/docs /2.1.0/api/python/pyspark.sql.html#pyspark.sql.types.StructField (2认同)

Emi*_*l44 5

创建一个空的 DataFrame:

val my_schema = StructType(Seq(
    StructField("field1", StringType, nullable = false),
    StructField("field2", StringType, nullable = false)
  ))

val empty: DataFrame = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], my_schema)
Run Code Online (Sandbox Code Playgroud)

也许这可能有帮助


小智 5

与EmiCareOfCell44的答案类似,只是更优雅一点,更“空”一点

val emptySchema = StructType(Seq())
val emptyDF = spark.createDataFrame(spark.sparkContext.emptyRDD[Row],
                emptySchema)
Run Code Online (Sandbox Code Playgroud)