Просто некоторые комментарии к очень полезному ответу patricksurry:
Вот немного модифицированный код:
from pyspark.sql.types import *
rdd = sc.parallelize([('X01',41,'US',3),
('X01',41,'UK',1),
('X01',41,'CA',2),
('X02',72,'US',4),
('X02',72,'UK',6),
('X02',72,'CA',7),
('X02',72,'XX',8)])
schema = StructType([StructField('ID', StringType(), True),
StructField('Age', IntegerType(), True),
StructField('Country', StringType(), True),
StructField('Score', IntegerType(), True)])
df = sqlCtx.createDataFrame(rdd, schema)
# u is a dictionarie
# v is a Row
def seqPivot(u, v):
if not u:
u = {}
u[v.Country] = v.Score
# In the original posting the Age column was not specified
u["Age"] = v.Age
return u
# u1
# u2
def cmbPivot(u1, u2):
u1.update(u2)
return u1
pivot = (
rdd
.map(lambda row: Row(ID=row[0], Age=row[1], Country=row[2], Score=row[3]))
.keyBy(lambda row: row.ID)
.aggregateByKey(None, seqPivot, cmbPivot)
)
columns = (
pivot
.values()
.map(lambda u: set(u.keys()))
.reduce(lambda s,t: s.union(t))
)
columns_ord = sorted(columns)
result = sqlCtx.createDataFrame(
pivot
.map(lambda (k, u): [k] + [u.get(c, None) for c in columns_ord]),
schema=StructType(
[StructField('ID', StringType())] +
[StructField(c, IntegerType()) for c in columns_ord]
)
)
print result.show()
Наконец, выход должен быть
+---+---+---+---+---+----+
| ID|Age| CA| UK| US| XX|
+---+---+---+---+---+----+
|X02| 72| 7| 6| 4| 8|
|X01| 41| 2| 1| 3|null|
+---+---+---+---+---+----+
"Библиотека электронных таблиц предназначена для чтения и записи документов электронных таблиц. Начиная с версии 0.6.0, поддерживаются только электронные таблицы, совместимые с Microsoft Excel. Spreadsheet представляет собой комбинацию/полную переработку библиотеки Spreadsheet::Excel от Daniel J. Berger и библиотеки ParseExcel от Hannes Wyss. Spreadsheet может читать, записывать и изменять документы Spreadsheet."
EDIT
.
Чтобы получить загруженный файл, у вас есть два варианта:
1. (рекомендуется) Использовать плагин для загрузки файлов, например paperclip, и он справится со всеми деталями.
2. используйте объект IO params[:dump][:excel_file]
согласно: http://guides.rails.info/form_helpers.html#what-gets-uploaded
мы используем roo , который поддерживает Open Office, Excel, Google, Excel.xlsx