我们的群集有Spark 1.3和Hive
有一个大的Hive表,我需要添加随机选择的行。
我读了一个较小的表并检查了一个条件,如果那个条件为真,那么我抓住我需要的变量然后查询要填充的随机行。我所做的是对该条件table.where(value<number)
进行查询,然后使用take(num rows)
将其设为数组。然后,由于所有这些行都包含我需要的信息,我需要从大型hive表中随机行,我遍历数组。
当我执行查询时,我在查询中使用ORDER BY RAND()
(使用sqlContext
)。我创建了一个var Hive table
(可变)从较大的表中添加一列。在循环中,我执行unionAll newHiveTable = newHiveTable.unionAll(random_rows)
我已经尝试了很多不同的方法来做到这一点,但我不确定什么是避免CPU和临时磁盘使用的最佳方法。我知道Dataframes不适用于增量添加。 我现在尝试的一件事就是创建一个cvs文件,在循环中逐步将随机行写入该文件,然后在循环结束时,将cvs文件作为表加载,然后执行一个unionAll来获取最终结果表
任何反馈都会很棒。感谢
答案 0 :(得分:2)
我建议你用hive创建一个外部表,定义位置,然后让spark将输出写为csv到该目录:
在Hive中:
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)