簡體   English   中英

將Spark數據幀保存到按日期分區的HDFS

[英]Save Spark dataframe to HDFS partitioned by date

我需要將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(_))

如果您可以使用目錄結構

tablename/date=2019-08-12
tablename/date=2019-08-13

相反, DataFrameWriter.partitionBy可以解決問題。 例如

val df =
  Seq((Timestamp.valueOf("2019-06-01 12:00:00"), 1),
      (Timestamp.valueOf("2019-06-01 12:00:01"), 2),
      (Timestamp.valueOf("2019-06-02 12:00:00"), 3)).toDF("time", "foo")

df.withColumn("date", to_date($"time"))
  .write
  .partitionBy("date")
  .format("avro")
  .save("/tmp/foo")

產生以下結構

find /tmp/foo
/tmp/foo
/tmp/foo/._SUCCESS.crc
/tmp/foo/date=2019-06-01
/tmp/foo/date=2019-06-01/.part-00000-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro.crc
/tmp/foo/date=2019-06-01/part-00000-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro
/tmp/foo/date=2019-06-01/.part-00001-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro.crc
/tmp/foo/date=2019-06-01/part-00001-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro
/tmp/foo/_SUCCESS
/tmp/foo/date=2019-06-02
/tmp/foo/date=2019-06-02/part-00002-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro
/tmp/foo/date=2019-06-02/.part-00002-2a7a63f2-7038-4aec-8f76-87077f91a415.c000.avro.crc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM