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)
我希望这有帮助。
创建一个空的 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)
| 归档时间: |
|
| 查看次数: |
18990 次 |
| 最近记录: |