Как добавить значения List [String] в один столбец в Dataframe - PullRequest
0 голосов
/ 03 января 2019

У меня есть фрейм данных, у меня есть список значений (возможно, строка списка), и я хочу создать новый столбец в моем фрейме данных и добавить эти значения списка в качестве значений столбца в этот новый столбец.Я пробовал

val x = List("def", "cook", "abc")
val c_df = null
x.foldLeft(c_df)((df, column) => df.withColumn("newcolumnname" , lit(column)))

, но выдает исключение StackOverflow, я также пытался перебирать список строковых значений и добавлять их в фрейм данных, но результирующее значение - это список фреймов данных, но все, что мне нужно, - это один фрейм данных.

Пожалуйста, помогите!

вот пример ввода и вывода данных: enter image description here

Ответы [ 2 ]

0 голосов
/ 03 января 2019

В Spark 1.4 или более поздней версии есть функция array, которая принимает массив Column с и возвращает новый Column. Функция lit принимает значение Scala и возвращает тип Column.

import spark.implicits._
val df = Seq(1, 2, 3).toDF("col1")
df.withColumn("new_col", array(lit("def"), lit("cook"), lit("abc"))).show

+----+----------------+
|col1|         new_col|
+----+----------------+
|   1|[def, cook, abc]|
|   2|[def, cook, abc]|
|   3|[def, cook, abc]|
+----+----------------+

В Spark 2.2.0 есть функция typedLit, которая принимает типы Scala и возвращает тип Column. эта функция может обрабатывать параметризованные типы scala, например: List, Seq и Map.

val newDF = df.withColumn("new_col", typedLit(List("def", "cook", "abc")))
newDF.show()
newDF.printSchema()

+----+----------------+
|col1|         new_col|
+----+----------------+
|   1|[def, cook, abc]|
|   2|[def, cook, abc]|
|   3|[def, cook, abc]|
+----+----------------+

root
 |-- col1: integer (nullable = false)
 |-- new_col: array (nullable = false)
 |    |-- element: string (containsNull = true)

Это то, что вы хотели сделать? Вы можете добавить when, чтобы условно добавить разные наборы списков в каждую строку.

0 голосов
/ 03 января 2019

Вы можете попробовать код ниже.

  1. Создание первого фрейма данных с индексом.
from pyspark.sql.functions import *
from pyspark.sql import Window
w = Window.orderBy("Col2")
df = spark.createDataFrame([("a", 10), ("b", 20), ("c",  30)], ["Col1", "Col2"])
df1 = df.withColumn("index", row_number().over(w))
df1.show()
  1. Создать еще один DataFrame из списка значений.
from pyspark.sql.types import * newdf = spark.createDataFrame(['x','y', 'z'], StringType()) newdf.show()
  1. Добавить столбец индекса в DF, созданный из списка значений в шаге 2.
 w = Window.orderBy("value")
df2 = newdf.withColumn("index", row_number().over(w))
df2.show()
  1. Присоединение DataFrame df1 и df2 на основе индекса.

df1.join(df2, "index").show()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...