Импорт Excel в приложение Rails

Просто некоторые комментарии к очень полезному ответу patricksurry:

  • отсутствует столбец Age, поэтому просто добавьте u ["Age"] = v.Age к функции seqPivot
  • оказалось, что обе петли над элементами столбцов давали элементы в другом порядке. Значения столбцов были правильными, но не именами их. Чтобы избежать этого, просто закажите список столбцов.

Вот немного модифицированный код:

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|
+---+---+---+---+---+----+
30
задан skaffman 16 June 2010 в 15:19
поделиться

2 ответа

"Библиотека электронных таблиц предназначена для чтения и записи документов электронных таблиц. Начиная с версии 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

27
ответ дан 28 November 2019 в 00:02
поделиться

мы используем roo , который поддерживает Open Office, Excel, Google, Excel.xlsx

15
ответ дан 28 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: