1

我们的集群有 Spark 1.3 和 Hive 有一个大型 Hive 表,我需要向其中添加随机选择的行。有一个较小的表,我读取并检查一个条件,如果该条件为真,那么我获取我需要的变量,然后查询要填充的随机行。我所做的是在该条件下进行查询table.where(value<number),然后使用take(num rows). 然后,由于所有这些行都包含我需要的关于大型 hive 表中需要哪些随机行的信息,所以我遍历数组。

当我进行查询时,我在查询中使用ORDER BY RAND()(使用sqlContext)。我创建了一个var Hive table(可变的)从较大的表中添加一列。在循环中,我做了一个 unionAllnewHiveTable = newHiveTable.unionAll(random_rows)

我尝试了许多不同的方法来做到这一点,但不确定什么是避免 CPU 和临时磁盘使用的最佳方法。我知道 Dataframes 不适合增量添加。我现在要尝试的一件事是创建一个 cvs 文件,在循环中逐步将随机行写入该文件,然后当循环完成时,将 cvs 文件加载为表,然后执行一个 unionAll 以获得我的最终结果桌子。

任何反馈都会很棒。谢谢

4

1 回答 1

2

我建议您使用 hive 创建一个外部表,定义位置,然后让 spark 将输出作为 csv 写入该目录:

在蜂巢中:

create external table test(key string, value string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
LOCATION '/SOME/HDFS/LOCATION'

然后在https://github.com/databricks/spark-csv的帮助下从 spark 中 ,将数据帧写入 csv 文件并附加到现有文件:

df.write.format("com.databricks.spark.csv").save("/SOME/HDFS/LOCATION/", SaveMode.Append)
于 2016-04-26T16:02:36.987 回答