已编辑。
我看起来有点生锈。
以下代码段:
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域中。不知何故,做不到。
按照下面的选择,将其转换为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的最简单方法是什么。
答案 0 :(得分:1)
从您的要求中仅提取出固定下面代码的数组的第二个元素:
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(",").lift(1).getOrElse("0").toInt)