簡體   English   中英

如何在Spark中創建一個空的dataFrame

[英]How to create an empty dataFrame in Spark

我有一組基於Avro的配置單元表,我需要從中讀取數據。 由於Spark-SQL使用配置單元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()

解決方法:

我已經在該目錄中放置了一個空文件,並且相同的東西工作正常。

還有其他方法可以達到相同目的嗎? 像conf設置之類的?

與EmiCareOfCell44的答案類似,只是更優雅,更“空”

val emptySchema = StructType(Seq())
val emptyDF = spark.createDataFrame(spark.sparkContext.emptyRDD[Row],
                emptySchema)

要創建一個空的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)

也許這可能有所幫助

根據您的Spark版本,您可以使用反射方式。.SchemaConverters中有一個私有方法,可以完成將Schema轉換為StructType的工作。(不確定坦率地說為什么它是私有的,這真的很有用)在其他情況下)。 使用scala反射,您應該可以通過以下方式進行

import scala.reflect.runtime.{universe => ru}
import org.apache.avro.Schema
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

var schemaStr = "{\n \"type\": \"record\",\n \"namespace\": \"com.example\",\n \"name\": \"FullName\",\n \"fields\": [\n { \"name\": \"first\", \"type\": \"string\" },\n      { \"name\": \"last\", \"type\": \"string\" }\n  ]\n }"
val schema = new Schema.Parser().parse(schemaStr);

val m = ru.runtimeMirror(getClass.getClassLoader)
val module = m.staticModule("com.databricks.spark.avro.SchemaConverters")
val im = m.reflectModule(module)
val method = im.symbol.info.decl(ru.TermName("toSqlType")).asMethod

val objMirror = m.reflect(im.instance)
val structure = objMirror.reflectMethod(method)(schema).asInstanceOf[com.databricks.spark.avro.SchemaConverters.SchemaType]
val sqlSchema = structure.dataType.asInstanceOf[StructType]
val empty = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], sqlSchema)

empty.printSchema

您不需要使用emptyRDD。 這是PySpark 2.4對我有用的東西:

empty_df = spark.createDataFrame([], schema) # spark is the Spark Session

如果您已經具有另一個數據框的架構,則可以執行以下操作:

schema = some_other_df.schema

如果沒有,請手動創建空數據框的架構,例如:

schema = StructType([StructField("col_1", StringType(), True),
                     StructField("col_2", DateType(), True),
                     StructField("col_3", StringType(), True),
                     StructField("col_4", IntegerType(), False)]
                     )

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM