Apache spark 从RDD元组中提取嵌套值

Apache spark 从RDD元组中提取嵌套值,apache-spark,Apache Spark,编辑 看起来我有点生锈了 以下代码段: 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

编辑

看起来我有点生锈了

以下代码段:

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最简单的方法是什么。

从您的请求中,只提取数组的第二个元素,修复下面的代码:

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))

您可以使用Dataframe方法,然后调用df.rdd来获取rddAlso,因为它是您应该执行的数组:
val rddx=rddx-1.map(x=>x.。_2(1))
如果数组总是包含多个元素,或者添加
if。。否则
如果这是答案,请发布。我已将其作为答案发布。