将GenericRecord转换为DF

时间:2018-11-30 22:46:03

标签: scala apache-spark avro spark-structured-streaming

我在流式处理方面有一个要求,在该类中,必须将GenericRecord转换为DatFrame,以便可以使用EXPLODE和DF中可用的其他功能。因此,首先,我研究如何将GenericRecord转换为DF。

我已经检查了以下URL,该URL有助于将记录转换为DF。但是无法理解如何将SchemaConverterUtils类添加到avro对象。

How to convert RDD[GenericRecord] to dataframe in scala?

当我尝试编辑时,它会给我只读文件。是scala / java的新手。您能帮我了解如何做吗。

谢谢

1 个答案:

答案 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。根据网站上的文档,您还有其他选择,但是从您的描述来看,我认为这是最接近的。