我在流式处理方面有一个要求,在该类中,必须将GenericRecord转换为DatFrame,以便可以使用EXPLODE和DF中可用的其他功能。因此,首先,我研究如何将GenericRecord转换为DF。
我已经检查了以下URL,该URL有助于将记录转换为DF。但是无法理解如何将SchemaConverterUtils类添加到avro对象。
How to convert RDD[GenericRecord] to dataframe in scala?
当我尝试编辑时,它会给我只读文件。是scala / java的新手。您能帮我了解如何做吗。
谢谢
答案 0 :(得分:0)
关于该帖子, spark-avro 库已被DataBricks弃用,并捐赠给了Spark。
ABRiS 库提供了UDF,用于将Array[Byte]
的列转换为复杂类型的列,并最终转换为 DataFrame 。
在您的情况下,您应该先进行两次转换。
import org.apache.spark.sql.DataFrame
import za.co.absa.abris.avro.functions.from_avro
import za.co.absa.abris.examples.data.generation.AvroDataUtils
val spark: SparkSession = SparkSession
.builder().master("local[*]").getOrCreate()
// read data into an RDD of GenericRecord called "genericRecordRdd"
// Have your schema in string format in a variable called "stringSchema"
import spark.implicits._
val domainDF: DataFrame = genericRecordRdd
.map(AvroDataUtils.recordToBytes)
.toDF("value")
.select(from_avro(col("value"), stringSchema) as 'data).select("data.*")
AvroDataUtils.recordToBytes
是ABRiS库的一部分,该库将GenericRecord
对象转换为Array[Byte]
。然后,创建一个仅包含一列的DataFrame
,并将其称为"value"
。目前,您可以使用from_avro
UDF。根据网站上的文档,您还有其他选择,但是从您的描述来看,我认为这是最接近的。