Как разделить фрейм данных pyspark на основе содержимого строки - PullRequest
1 голос
/ 10 октября 2019

Я хочу разбить файл по первому символу строки в Pyspark DataFrame.

Исходные данные имеют столбец, данные включают

  1. имя файла (например, 'DATE20191009')

  2. содержимое файла (например, «1», «2», «3»)

Входной файл примера (Pyspark DataFrame):

column1

Date20191009

1

2

3

Date20191010

1

4

5

Я хочу получить Pyspark DataFrame с именем файла в качестве разделения данных.

Имя файла помещается в столбец 1 кадра данных, а содержимое файла помещается в столбец 2 кадра данных.

Ожидаемый вывод (Фрейм данных Pyspark)

column1  column2
Date20191009 [1,2,3]
Date20191010 [1,4,5]

Я пытался использовать Pandas Dataframe и Pyspark DataFrame.collect () , но оба не удалось из-за чрезмерного объема данных (более 9 миллионов строк).

1 Ответ

0 голосов
/ 11 октября 2019
>>> from pyspark.sql.window import Window
>>> from pyspark.sql.functions import *
>>> w = Window.rowsBetween(Window.unboundedPreceding, 0)

   #Input DataFrame

>>> df.show()
+------------+
|     column1|
+------------+
|Date20191009|
|           1|
|           2|
|           3|
|Date20191010|
|           1|
|           4|
|           5|
+------------+

>>> df1 = df.withColumn('tmp', when(df.column1.startswith('Date'), df.column1).otherwise(None)).withColumn('temp', last('tmp', True).over(w)).drop('tmp')
>>> df1.show()

+------------+------------+
|     column1|        temp|
+------------+------------+
|Date20191009|Date20191009|
|           1|Date20191009|
|           2|Date20191009|
|           3|Date20191009|
|Date20191010|Date20191010|
|           1|Date20191010|
|           4|Date20191010|
|           5|Date20191010|
+------------+------------+

>>> df1.filter(df1.column1 != df1.temp).groupBy(df1.temp).agg(concat_ws(',',collect_list(df1.column1)).alias('column2')).withColumnRenamed("temp", "column1").show()

+------------+-------+
|     column1|column2|
+------------+-------+
|Date20191009|  1,2,3|
|Date20191010|  1,4,5|
+------------+-------+
...