PySpark - создать несколько файлов JSON из DataFrame - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть данные в следующем формате, которые получены из Hive в фрейм данных:

date, stock, price
1388534400, GOOG, 50
1388534400, FB, 60
1388534400, MSFT, 55
1388620800, GOOG, 52
1388620800, FB, 61
1388620800, MSFT, 55

Где дата - это эпоха полуночи в этом дне, и у нас есть данные, возвращающиеся примерно на 10 лет назад(800 миллионов + рядов).Моя цель состоит в том, чтобы получить кучу файлов JSON, по одному на акцию, которые выглядели бы так:

GOOG.json:
{
'1388534400': 50,
'1388620800': 52
}

FB.json:
{
'1388534400': 60,
'1388620800': 61
}

Наивным способом было бы получить список уникальных акций, а затем получить подмножествофрейм данных, отфильтровывая только те строки для каждой акции, но это кажется чрезмерно наивным и ужасно неэффективным.Можно ли это легко сделать в Spark?В настоящее время он работает на нативном Python с использованием PyHive, но из-за большого объема данных я предпочел бы сделать это на кластере / Spark.

1 Ответ

0 голосов
/ 26 декабря 2018

Да.Это довольно просто.Вы можете использовать DataFrameWriter и использовать partitionBy - укажите столбцы для разделения (в вашем случае это будет сток)

Из документации Pyspark:

df.write.partitionBy ('year', 'month'). parquet (os.path.join (tempfile.mkdtemp (), 'data'))

Для вас это будет

df.write.partitionBy('stock').json(os.path.join(tempfile.mkdtemp(), 'data'))

Обратите внимание на несколько вещей:

  • Возможно, потребуется много перетасовок в зависимости от того, как выложены таблицы Hive.
  • Даже после разделов вы можете оказаться в итогес более чем одним файлом на раздел в зависимости от количества записей в этом разделе.Например, 30% активности может быть для GOOG, и в этом случае раздел для GOOG будет намного больше, чем другие.Вам просто нужно запустить сценарий объединения файлов для каждого раздела, если вы столкнетесь с этим.Однако файлы в каждом разделе будут по-прежнему храниться в одной папке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...