【发布时间】:2023-03-22 10:16:01
【问题描述】:
我有一个 Spark 作业,将一些数据处理成几个单独的数据帧。我将这些数据帧存储在一个列表中,即数据帧 []。最终,我想将这些数据帧组合成分层格式,并将输出写入 avro。 avro 架构是这样的:
{
"name": "mydata",
"type": "record",
"fields": [
{"name": "data", "type": {
"type": "array", "items": {
"name": "actualData", "type": "record", "fields": [
{"name": "metadata1", "type": "int"},
{"name": "metadata2", "type": "string"},
{"name": "dataframe", "type": {
"type": "array", "items": {
"name": "dataframeRecord", "type": "record", "fields": [
{"name": "field1", "type": "int"},
{"name": "field2", "type": "int"},
{"name": "field3", "type": ["string", "null"]}]
}
}
}]
}
}
}
]
}
可以推断,每个数据帧都有三个字段,field1、field2 和 field3,我想将它们作为数组写入 avro 文件。还有一些与每个数据帧相关的元数据。
我目前的做法是,一旦处理完这些数据,将数据帧写入 S3,然后使用单独的程序从 S3 中提取这些数据,使用 avro 库编写 avro 文件,然后将其上传到 S3再次。
但是,随着数据量的增长,这变得非常缓慢。我已经查看了 databricks 库以直接编写 avro 文件,但我不知道如何在内存中将数据帧组合在一起,或者 databricks 库如何确定我正在使用的架构。
在 Spark 中有没有一种惯用的方法来做到这一点?
附:我在 Python 中使用 EMR 和 Spark 2.0.0。
【问题讨论】:
标签: apache-spark pyspark avro emr spark-avro