如何处理存储在非常大的未分区Hive表的行中的JSON

时间:2018-06-15 18:08:55

标签: java apache-spark hive apache-spark-sql

我使用spark SQL(spark 2.1)来读取hive表。 hive表的模式如下(简化为与我的问题相关的唯一字段,另一个是无用的):

身体类型:Bynary

正文是一个有多个字段的JSON,我感兴趣的是一个数组。在这个数组的每个索引中,我有另一个包含日期的JSON。 我的目标是获取一个数据集,其中填充了我的数组的所有对象,其日期优于"插入所需日期"。

为此,我使用以下代码:

SparkConfig conf = //set the kryo serializer and tungsten at true

SparkSession ss = //set the conf on the spark session

Dataset<String> dataset = creatMyDatasetWithTheGoodType(SS.SQL("select * from mytable "));

Dataset<String> finalds = dataset.flatmap(json-> 
List<String> l = new ArrayList<>();
List<String> ldate =//i use Jackson to obtain the array of date, this action return a list
For(int i = O; i < ldate.size ; i++) { 
//if date is ok i add it to l
}

Return l.iterator()
});

(我的代码正在研究我给它的一个小数据集,以便了解我在做什么) 问题是这个蜂巢表有2200万行。 工作转了14个小时并没有完成(我杀了它但没有错误或GC开销)

我用带有4个执行器的yarn-client运行它,每个执行器有16个内存。驱动程序有4个内存。每个执行者都有1个核心。

我使用了hdfs dfs -du hiveTableLocationPath,结果我喜欢45 Go。

我可以做些什么来调整我的工作?

1 个答案:

答案 0 :(得分:0)

我建议尝试使用这个允许json columns within hive工作的UDTF 然后可以以分布式和优化的方式操作大型json并获取所需数据。