Объединение JSON файлов в Spark RDD - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть ряд файлов, которые выглядят примерно так:

[
 {
  'id':1,
  'transactions': [
   {
    'date': '2019-01-01',
    'amount': 50.50
   },
   {
    'date': '2019-01-02',
    'amount': 10.20
   },
  ]
 },
 {
  'id':2,
  'transactions': [
   {
    'date': '2019-01-01',
    'amount': 10.20
   },
   {
    'date': '2019-01-02',
    'amount': 0.50
   },
  ]
 }
]

Я загружаю эти файлы в Spark, используя следующий код

users= spark.read.option("multiline", "true").json(file_location)

В результате получается кадр SparkData с двумя столбцами id и transactions, где transactions - это тип StructType.

Я хочу иметь возможность "сопоставить" transactions для пользователя, чтобы объединить их.

В настоящее время я использую rdd и функцию, которая выглядит следующим образом:

users.rdd.map(lambda a: summarize_transactions(a.transactions))

Функция суммирования может быть двух типов:
a) Превратить список объектов в Pandas Dataframe, чтобы суммировать его.
b) Перебирать список объектов, чтобы суммировать его.

Однако я узнаю, что a.transactions - это список pyspark.sql.types.Row. Вместо реальных словарей.

1) Это лучший способ достичь sh моей цели?
2) Как я могу превратить список Spark Rows в исходный список словарей?

1 Ответ

0 голосов
/ 21 апреля 2020

Я нашел способ решить свою проблему:

ШАГ 1: ЗАГРУЗИТЬ ДАННЫЕ КАК ТЕКСТИЛЬ:
step1= sc.textFile(file_location)

ШАГ 2: ПРОЧИТАТЬ КАК JSON И FLATMAP

import json
step2 = step1.map(lambda a: json.loads(a)).flatMap(lambda a: a)

ШАГ 3: СНИЖЕНИЕ КЛЮЧЕВОЙ КАРТЫ

setp3 = (
 step2
 .map(lambda line: [line['id'], line['transactions']])
 .reduceByKey(lambda a, b: a + b)
 .mapValues(lambda a: summarize_transactions(a))
)
...