Объединить несколько строк информационного кадра в одну запись - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно объединить все строки в PySpark DataFrame в список, а затем добавить дополнительный атрибут для отправки в API в пакетном режиме.Вот как выглядит json из df:

{"event_type": "click", "visitor_platform": "mobile", "visitor_country": "CA", "mp_os": "Android "," user_properties ": {" different_id ": 123," user_id ": 345}} {" event_type ":" click "," visitor_platform ":" mobile "," visitor_country ":" US "," mp_os ":"Android", "user_properties": {"different_id": 321, "user_id": 543}}

добавить дополнительный атрибут с именем load и преобразовать в один список записей

{"load": 123, "events": [{"event_type": "click", "visitor_platform": "mobile", "visitor_country": "CA", "mp_os": "Android", "user_properties ": {" Different_id ": 123,« user_id »: 345}}, {« event_type »:« click »,« visitor_platform »:« mobile »,« visitor_country »:« US »,« mp_os »:« Android », "user_properties": {"different_id": 321, "user_id": 543}}]}

1 Ответ

2 голосов
/ 24 сентября 2019

Вы создаете новый словарь.А внутри events вы можете вызвать df.toJSON().collect()

>>> df.show()
+-------+------+-------------------+
|user_id|amount|         trans_date|
+-------+------+-------------------+
|    101| 99.10|2019-06-04 00:00:00|
|    102| 89.27|2019-06-04 00:00:00|
|    102| 89.10|2019-03-04 00:00:00|
|    103| 73.11|2019-09-10 00:00:00|
|    101|-69.81|2019-09-11 00:00:00|
|    101| 12.51|2018-12-14 00:00:00|
|    101| 43.23|2018-09-11 00:00:00|
+-------+------+-------------------+
>>> dict1 = {"load": 123, "events": df.toJSON().collect()}
>>> dict1
{'load': 123, 'events': ['{"user_id":"101","amount":"99.10","trans_date":"2019-06-04T00:00:00.000+05:30"}', '{"user_id":"102","amount":"89.27","trans_date":"2019-06-04T00:00:00.000+05:30"}', '{"user_id":"102","amount":"89.10","trans_date":"2019-03-04T00:00:00.000+05:30"}', '{"user_id":"103","amount":"73.11","trans_date":"2019-09-10T00:00:00.000+05:30"}', '{"user_id":"101","amount":"-69.81","trans_date":"2019-09-11T00:00:00.000+05:30"}', '{"user_id":"101","amount":"12.51","trans_date":"2018-12-14T00:00:00.000+05:30"}', '{"user_id":"101","amount":"43.23","trans_date":"2018-09-11T00:00:00.000+05:30"}']}

Если вам не нравятся строки JSON вместо dict объектов, вы можете использовать json.loads превратить его в диктофон питона

>>> import json
>>> dict2 = {"load": 123, "events": [json.loads(x) for x in df.toJSON().collect()]}
{'load': 123, 'events': [{'user_id': '101', 'amount': '99.10', 'trans_date': '2019-06-04T00:00:00.000+05:30'}, {'user_id': '102', 'amount': '89.27', 'trans_date': '2019-06-04T00:00:00.000+05:30'}, {'user_id': '102', 'amount': '89.10', 'trans_date': '2019-03-04T00:00:00.000+05:30'}, {'user_id': '103', 'amount': '73.11', 'trans_date': '2019-09-10T00:00:00.000+05:30'}, {'user_id': '101', 'amount': '-69.81', 'trans_date': '2019-09-11T00:00:00.000+05:30'}, {'user_id': '101', 'amount': '12.51', 'trans_date': '2018-12-14T00:00:00.000+05:30'}, {'user_id': '101', 'amount': '43.23', 'trans_date': '2018-09-11T00:00:00.000+05:30'}]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...