如何将历史JSON文件加载到日期分区的Apache Hive表中?

时间:2019-03-20 06:29:01

标签: json apache-spark hive

这是我的要求,

  • 我有一堆没有日期标签的JSON文件。
  • 日期以文件名提供(例如:PLV_sample1_ 01-12-2018 .json)。
  • 我总共有来自不同日期的40K JSON历史文件。

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

1 个答案:

答案 0 :(得分:0)

在这里您无法通过使用json阅读器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(“日期”).save(“接收器的路径”)

注意:如果Hive是您的接收器,而表是外部的,则给hive外部表路径。或者,您可以使用saveAsTable(“表名”)。在这里spark将创建配置单元表并以日期作为分区列加载数据。