在我的用例中,我有一个包含10万条记录的hive表。每条记录代表一个必须处理的原始数据文件。处理每个原始数据文件会生成一个csv文件,其大小将在10MB到500MB之间变化。最后,这些CSV文件作为单独的进程填充到HIve表中。在我的企业集群中,仍然不建议在hdfs中生成大量数据。因此,我更喜欢将这两个独立的流程分成一个流程,这样他们就可以处理5000条记录5000条记录。
我的问题: -
鉴于我的rdd引用了整个hive表,我如何为每5000条记录执行原始数据处理步骤? (类似于for循环,每次增加5000条记录)
答案 0 :(得分:1)
一种方法是使用RDD的滑动功能。你可以在apache spark的mllib包中找到它。以下是如何使用它。 假设我们有一个包含1000个元素的rdd
val rdd = sc.parallelize(1 to 1000)
import org.apache.spark.mllib.rdd._
val newRdd = RDDFunctions.fromRDD(rdd)
// sliding by 10 (instead use 5000 or what you need)
val rddSlidedBy10 = newRdd.sliding(10, 10)
结果将如下所示
Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Array(11, 12, 13, 14, 15, 16, 17, 18, 19, 20), Array(21, 22, 23, 24, 25, 26, 27, 28, 29, 30), Array(31, 32, 33, 34, 35, 36, 37, 38, 39, 40), Array(41, 42, 43, 44, 45, 46, 47, 48, 49, 50), Array(51, 52, 53, 54, 55, 56, 57, 58, 59, 60), Array(61, 62, 63, 64, 65, 66, 67, 68, 69, 70), Array(71, 72, 73, 74, 75, 76, 77, 78, 79, 80)
您可以在阵列上使用foreach并将原始数据处理为CSV