Позвольте мне на простом примере объяснить, что я пытаюсь сделать. допустим, у нас есть два очень простых фрейма данных, как показано ниже:
Df1
+---+---+---+
| a1| a2| a3|
+---+---+---+
| 2| 3| 7|
| 1| 9| 6|
+---+---+---+
Df2
+---+---+
| b1| b2|
+---+---+
| 10| 2|
| 9| 3|
+---+---+
Из df1, df2 нам нужно создать новый df со столбцами, которые являются декартовым произведением исходных столбцов из df1, df2. В частности, новый df будет иметь ‘a1b1’, ’a1b2’, ’a2b1’, ’a2b2’, ’a3b1’, ’a3b2’, а строки будут умножением соответствующих столбцов из df1, df2. Результат df должен выглядеть следующим образом:
Df3
+----+----+----+----+----+----+
|a1b1|a1b2|a2b1|a2b2|a3b1|a3b2|
+----+----+----+----+----+----+
| 20| 4| 30| 6| 70| 14|
| 9| 3| 81| 27| 54| 18|
+----+----+----+----+----+----+
Я искал искровые онлайн-документы, а также вопросы, размещенные здесь, но похоже, что они все о декартовом произведении строк, а не столбцов. Например, rdd.cartesian () предоставляет декартово произведение различных комбинаций значений в строке, как в следующем коде:
r = sc.parallelize([1, 2])
r.cartesian(r).toDF().show()
+---+---+
| _1| _2|
+---+---+
| 1| 1|
| 1| 2|
| 2| 1|
| 2| 2|
+---+---+
Но это не то, что мне нужно. Опять же, мне нужно создавать новые столбцы вместо строк. В моей проблеме количество строк останется таким же. Я понимаю, что udf может в конечном итоге решить проблему. Однако в моем реальном приложении у нас есть огромный набор данных, который занимает слишком много времени для создания всех столбцов (около 500 новых столбцов как все возможные комбинации столбцов). мы предпочитаем иметь некоторые виды векторных операций, которые могут повысить эффективность. Возможно, я ошибаюсь, но похоже, что spark udf основан на строковых операциях, что может быть причиной того, что на его завершение ушло так много времени.
Большое спасибо за любые предложения / отзывы / комментарии.
Для вашего удобства я прикрепил сюда простой код для создания примеров фреймов данных, показанных выше:
df1 = sqlContext.createDataFrame([[2,3,7],[1,9,6]],['a1','a2','a3'])
df1.show()
df2 = sqlContext.createDataFrame([[10,2],[9,3]],['b1','b2'])
df2.show()
df1.join(df2, ['id']).select([df1[x] * df2[y] for x in df1.columns for y in df2.columns if x != 'id' and y != 'id'])
, когдаid
- это столбец связи. - person zero323   schedule 18.02.2017