Извлечение вложенного значения из кортежа RDD - PullRequest
1 голос
/ 21 мая 2019

РЕДАКТИРОВАНИЕ.

Мне кажется, что он немного ржавый.

Следующий фрагмент:

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

Iхочу получить второй элемент массива, оставшийся в домене 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 Ответ

1 голос
/ 27 мая 2019

Из вашего запроса извлечь только второй элемент массива, исправляющий ваш код ниже:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...