【发布时间】:2019-06-03 12:04:12
【问题描述】:
我需要将 Spark 数据帧中的数据以 Avro 格式写入 HDFS。挑战在于数据应该每天保存,因此目录如下所示:tablename/2019-08-12、tablename/2019-08-13 等等。 我只有一个时间戳字段,我需要从中提取创建目录名称的日期。 我已经建立了一个有两个问题的方法: 1) 从时间戳中提取日期存在困难 3)在大型数据集(以后会更大)上,由于启动了很多任务,性能将非常糟糕。 那么我该如何改变/改进这种方法呢?
这是我使用的代码(dataDF是输入数据):
val uniqueDates = dataDF.select("update_database_time").distinct.
collect.map(elem => elem.getTimestamp(0).getDate)
uniqueDates.map(date => {
val resultDF = dataDF.where(to_date(dataDF.col("update_database_time")) <=> date)
val pathToSave = s"${dataDir}/${tableNameValue}/${date}"
dataDF.write
.format("avro")
.option("avroSchema", SchemaRegistry.getSchema(
schemaRegistryConfig.url,
schemaRegistryConfig.dataSchemaSubject,
schemaRegistryConfig.dataSchemaVersion))
.save(s"${hdfsURL}${pathToSave}")
resultDF
})
.reduce(_.union(_))
【问题讨论】:
-
您可以创建一个新的 Hive 表,该表将存储为 Avro 并按日期分区。然后,您可以将数据写入 Hive 并直接从文件中读取(文件将以您描述的方式存储)。
标签: scala apache-spark hdfs