Невозможно разбить столбец на несколько столбцов в кадре данных Spark - PullRequest
0 голосов
/ 23 октября 2019

Невозможно разделить столбец на несколько столбцов в кадре данных Spark и с помощью RDD. Я попробовал другие коды, но работает только с фиксированными столбцами. Пример:

Тип данных name:string , city =list(string)

У меня есть текстовый файл и входные данные, как показано ниже

Name, city

A, (hyd,che,pune)

B, (che,bang,del)

C, (hyd)

Требуется вывод:

A,hyd 

A,che

A,pune

B,che,

C,bang

B,del

C,hyd

после чтения текстового файла и преобразования DF.

Фрейм данных будет выглядеть ниже,

scala> data.show
+----------------+
|                 |
|           value |
|                 |
+----------------+

|      Name, city
|
|A,(hyd,che,pune)
|
|B,(che,bang,del)
|
|         C,(hyd)
|
|  D,(hyd,che,tn)|
+----------------+

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете использовать функцию explode на вашем DataFrame

val explodeDF = inputDF.withColumn("city", explode($"city")).show()

http://sqlandhadoop.com/spark-dataframe-explode/

Теперь, когда я понял, что вы загружаете всю строку в виде строки, вот решениео том, как добиться результата

Я определил две пользовательские функции

val split_to_two_strings: String => Array[String] = _.split(",",2) # to first split your input two elements to convert to two columns (name, city)
val custom_conv_to_Array: String => Array[String] = _.stripPrefix("(").stripSuffix(")").split(",") # strip ( and ) then convert to list of cities

import org.apache.spark.sql.functions.udf
val custom_conv_to_ArrayUDF = udf(custom_conv_to_Array)
val split_to_two_stringsUDF = udf(split_to_two_strings)


val outputDF = inputDF.withColumn("tmp", split_to_two_stringsUDF($"value"))
  .select($"tmp".getItem(0).as("Name"), trim($"tmp".getItem(1)).as("city_list"))
  .withColumn("city_array", custom_conv_to_ArrayUDF($"city_list"))
  .drop($"city_list")
  .withColumn("city", explode($"city_array"))
  .drop($"city_array")

outputDF.show()

Надеюсь, это поможет

...