PySpark - от RDD до JSON - PullRequest
       16

PySpark - от RDD до JSON

0 голосов
/ 25 июня 2018

У меня есть запрос Hive, который возвращает данные в этом формате:

ip, category, score
1.2.3.4, X, 5
10.10.10.10, A, 2
1.2.3.4, Y, 2
12.12.12.12, G, 10
1.2.3.4, Z, 9
10.10.10.10, X, 3

В PySpark я получаю это через hive_context.sql(my_query).rdd

Каждый IP-адрес может иметь несколько баллов (следовательно, несколько строк). Я хотел бы получить эти данные в формате json / array следующим образом:

{
    "ip": "1.2.3.4",
    "scores": [
        {
            "category": "X",
             "score": 10
        },
        {
            "category": "Y",
             "score": 2
        },
        {
            "category": "Z",
             "score": 9
        },
    ],
    "ip": "10.10.10.10",
    "scores": [
        {
            "category": "A",
             "score": 2
        },
        {
            "category": "X",
             "score": 3
        },
    ],
     "ip": "12.12.12.12",
    "scores": [
        {
            "category": "G",
             "score": 10
        },
    ],
}

Обратите внимание, что СДР не обязательно сортируется и СДР может легко содержать пару сотен миллионов строк. Я новичок в PySpark, поэтому любые советы о том, как сделать это эффективно, помогут.

1 Ответ

0 голосов
/ 25 июня 2018

groupBy ip и затем преобразовать сгруппированный СДР в то, что вам нужно:

rdd.groupBy(lambda r: r.ip).map(
  lambda g: {
    'ip': g[0], 
    'scores': [{'category': x['category'], 'score': x['score']} for x in g[1]]}
).collect()

# [{'ip': '1.2.3.4', 'scores': [{'category': 'X', 'score': 5}, {'category': 'Y', 'score': 2}, {'category': 'Z', 'score': 9}]}, {'ip': '12.12.12.12', 'scores': [{'category': 'G', 'score': 10}]}, {'ip': '10.10.10.10', 'scores': [{'category': 'A', 'score': 2}, {'category': 'X', 'score': 3}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...