【发布时间】:2019-05-20 21:25:00
【问题描述】:
已编辑。
我看起来有点生锈了。
下面的sn-p:
import org.apache.spark.sql.functions.input_file_name
val inputPath: String = "/FileStore/tables/g1.txt" //does work
val rdd = spark.read.text(inputPath)
.select(input_file_name, $"value")
.as[(String, String)]
.rdd
val rdd2 = rdd.map(line => (line._1, line._2.split(",")))
返回:
rdd2: org.apache.spark.rdd.RDD[(String, Array[String])] = MapPartitionsRDD[52] at map at command-2326393392121655:9
res13: Array[(String, Array[String])] = Array((dbfs:/FileStore/tables/g1.txt,Array(0, 5, 10)), (dbfs:/FileStore/tables/g1.txt,Array(202008, 5, 10)), (dbfs:/FileStore/tables/g1.txt,Array(202009, 10, 20)))
我想获取 RDD 域中剩余的 Array 的第二个元素。不知怎的,做不到。
按照下面的选择并转换为 DF,我可以不用担心得到 Int 值。但我对 RDD 方法很感兴趣。例如:
df.select($"value".getField("_2")).show(false)
正确返回:
5,5,10
但是,我无法通过 RDD 实现相同的效果。比如:
val rddx = rddx-1.map(x => (x._2._2))
DF 工作更简单,很好奇使用 RDD 最简单的方法是什么。
【问题讨论】:
-
可以使用Dataframe的方式,然后调用df.rdd获取rdd
-
另外,既然它是一个数组,你应该这样做:
val rddx = rddx-1.map(x => x._2(1))如果数组总是有超过 1 个元素或添加一个if .. else -
如果这是答案请贴出来。
-
我已将其发布为答案。
标签: apache-spark