【问题标题】:How to load historical JSON files into date partitioned apache hive table?如何将历史 JSON 文件加载到日期分区的 apache hive 表中?
【发布时间】:2019-08-10 18:59:21
【问题描述】:

这是我的要求,

  • 我有一堆没有日期标签的 JSON 文件。
  • 可以在文件名中找到日期(例如:PLV_sample1_01-12-2018.json)。
  • 我有来自不同日期的总共 40K JSON 历史文件。

我可以知道如何通过从文件名中提取日期来将此数据加载到日期分区的配置单元表中吗?

【问题讨论】:

    标签: json apache-spark hive


    【解决方案1】:

    在这里,您不能通过使用 json reader API 读取 json 文件来直接创建数据框,因为您的表是根据日期分区的,并且您的 Json 文件中不存在日期对象。

    但是您可以创建一个 json 文件名列表并对其进行迭代以从 json 文件中提取日期。

    我希望你所有的 json 文件名结构都是一样的。考虑到上面 创建一个包含所有文件名的对象,如下所示

    val obj = List("PLV_sample1_01-12-2018.json","PLV_sample1_02-12-2018.json","PLV_sample1_03-12-2018.json", "PLV_sample1_04-12-2018.json","PLV_sample1_05-12-2018.json")

    val date = obj.map(x => x.split("_").last.substring(0,10)).foreach(println) // 你所有的日期都会出现在这个对象中

    注意:我可以看到你有大约 40k 文件,所以如果集合很大,那么最好调用“toIndexedSeq”,那么性能会更好 O(1) val date = obj.toIndexedSeq.map(x => x.split("_").last.substring(0,10)).foreach(println)

    现在你有了所有的日期值

    先创建一个 sparkSession val df = spark.read.json("json 文件路径")

    使用 withColumn 方法,您可以在 DF 中将日期添加为列,同时写入接收器

    df.write.format("存储格式").partitionBy("date").save("接收器路径")

    注意:如果 Hive 是您的接收器并且表是外部的,那么请提供 hive 外部表路径。或者您可以使用 saveAsTable("Table name")。这里 spark 将创建 hive 表并以日期为分区列加载数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多