【问题标题】:Extracting nested value from an RDD Tuple从 RDD 元组中提取嵌套值
【发布时间】: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


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多