从RDD元组中提取嵌套值

时间:2019-05-20 21:25:00

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

1 个答案:

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