Вот код, чтобы создать pyspark.sql DataFrameКак добавить numpy.array в качестве нового столбца в pyspark.SQL DataFrame?
import numpy as np
import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext
df = pd.DataFrame(np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]), columns=['a','b','c'])
sparkdf = sqlContext.createDataFrame(df, samplingRatio=0.1)
Так что sparkdf выглядит
a b c
1 2 3
4 5 6
7 8 9
10 11 12
Теперь я хотел бы добавить новый столбец в Numpy массив (или даже список)
new_col = np.array([20,20,20,20])
но стандартным способом
sparkdf = sparkdf.withColumn('newcol', new_col)
не работает. Вероятно, udf - это путь, но я не знаю, как создать udf, который присваивает одно значение в строке DataFrame, т. Е. Итерации через new_col. Я посмотрел на другие pyspark и pyspark.sql, но не смог найти решение. Также мне нужно оставаться внутри pyspark.sql, а не решением scala. Благодаря!
Спасибо. Похоже, что (первое решение) вам нужно вернуться в RDD, а затем снова конвертировать в DataFrame, не оставаясь внутри pyspark.sql. Какое из двух решений обеспечивает лучшую производительность, т. Е. Быстрее? – rstreppa
Ну, игнорируя Catalyst, кадры данных - это всего лишь слой абстракции над RDD. Разумеется, накладные расходы из 'sqlContext.createDataFrame', которые могут быть значительно уменьшены путем ручного предоставления схемы. 'zip' сам по себе намного проще, чем объединение, и пока сохраняется порядок, вам не нужна сортировка. Я думаю, что важный вопрос заключается в том, почему вам нужно добавить новый столбец. Если он исходит из другого источника данных, тогда загрузка его в виде таблицы и соединения является естественным выбором. – zero323
На самом деле я получаю сообщение об ошибке: 'ValueError: может только zip с RDD, который имеет такое же количество разделов' – rstreppa