当我使用reduceByKey或者aggregateByKey,我遇到了分区问题.
EX)reduceBykey(_+_).map(code)
特别是,如果输入数据偏斜,则在使用上述方法时分区问题变得更糟.
所以,作为解决方案,我使用repartition方法.
例如,http://dev.sortable.com/spark-repartition/与此类似.
这对于分区分发很有用,但repartition也很昂贵.
有没有办法明智地解决分区问题?
这是两个RDD。
表1对(键,值)
val table1 = sc.parallelize(Seq(("1", "a"), ("2", "b"), ("3", "c")))
//RDD[(String, String)]
Run Code Online (Sandbox Code Playgroud)
表2-数组
val table2 = sc.parallelize(Array(Array("1", "2", "d"), Array("1", "3", "e")))
//RDD[Array[String]]
Run Code Online (Sandbox Code Playgroud)
我试图使用table1中的键和值将table2的元素(例如,“ 1”)更改为“ a”。我的预期结果如下:
RDD[Array[String]] = (Array(Array("a", "b", "d"), Array("a", "c", "e")))
Run Code Online (Sandbox Code Playgroud)
有没有办法使之成为可能?
如果是这样,使用庞大的数据集会更有效吗?
我想用intersection()钥匙或filter()火花来使用.
但我真的不知道如何使用intersection()密钥.
所以我尝试使用filter(),但它没有用.
示例 - 这是两个RDD:
data1 //RDD[(String, Int)] = Array(("a", 1), ("a", 2), ("b", 2), ("b", 3), ("c", 1))
data2 //RDD[(String, Int)] = Array(("a", 3), ("b", 5))
val data3 = data2.map{_._1}
data1.filter{_._1 == data3}.collect //Array[(String, Int] = Array()
Run Code Online (Sandbox Code Playgroud)
我希望得到一个(key,value)对,其密钥与data1基于密钥的密钥相同data2.
Array(("a", 1), ("a", 2), ("b", 2), ("b", 3)) 是我想要的结果.
是否有一种方法来解决这个问题使用intersection()键或filter()?
当火花使用saveAsTextFile将大文件写入HDFS时,出现错误: java.lang.IllegalArgumentException: Self-suppression not permitted at java.lang.Throwable.addSuppressed(Throwable.java:1043)
Caused by: java.io.IOException: All datanodes DatanodeInfoWithStorage
我一直在寻找解决方案,但是找不到正确的解决方案,我也不知道为什么。
是什么导致这些错误,我该如何解决?