如何在 Pyspark 中使用复杂数据类型

问题描述 投票:0回答:1

当我有一个数据框并且它有一个列名称是属性且属性类型是时,我遇到以下问题

|-- 属性:字符串(可为 null = true)

在那一栏中我有如下的值

[
    {'name': 'sfcc.created_by', 'type': 'STRING', 'value': 'DummyUser'},
    {'name': 'shippingLines', 'type': 'JSON', 'value': {'code': 'DUMMYCODE', 'price': '0', 'discountedPrice': '0'}},
    {'name': 'sourceChannel', 'type': 'STRING', 'value': 'dummyOS'},
    {'name': 'leaveAtDoor', 'type': 'BOOLEAN', 'value': False},
    {'name': 'actualCreateDate', 'type': 'STRING', 'value': '2024-01-01T00:00:00.000Z'},
    {'name': 'orderCompleteDate', 'type': 'STRING', 'value': '2024-01-02T00:00:00.000Z'},
    {'name': 'sfcc.order_date', 'type': 'STRING', 'value': '2024-01-01T00:00:00.000Z'},
    {'name': 'orderSuccessfullyCreatedInSAP', 'type': 'BOOLEAN', 'value': True},
    {'name': 'splitPayments', 'type': 'JSON', 'value': [{'price': '100', 'gateway': 'DUMMYGATEWAY', 'paymentGatewayName': 'DUMMY_CARD'}]},
    {'name': 'sfcc.customer_locale', 'type': 'STRING', 'value': 'en_US'},
    {'name': 'customerId', 'type': 'STRING', 'value': '000DummyID0000'},
    {'name': 'financialStatus', 'type': 'STRING', 'value': 'DUMMYSTATUS'},
    {'name': 'addressLine1', 'type': 'STRING', 'value': 'Dummy Street 1'},
    {'name': 'sourceLocation', 'type': 'STRING', 'value': 'DUMMYWEBSITE'},
    {'name': 'addressLine2', 'type': 'STRING', 'value': 'Dummy Street 2'},
    {'name': 'subtotalPrice', 'type': 'STRING', 'value': '100'},
    {'name': 'carrierId', 'type': 'STRING', 'value': 'DummyCarrier'},
    {'name': 'isCancelable', 'type': 'BOOLEAN', 'value': False},
    {'name': 'consignments', 'type': 'JSON', 'value': ['0000-0000-0000-0000']},
    {'name': 'sfcc.shipments', 'type': 'JSON', 'value': {'shipments': [{'items': [{'skuRef': '0000000000', 'quantity': 1}], 'isGift': False, 'shipmentId': '00000000', 'giftMessage': None, 'shippingAddress': {'area': 'Dummy Area', 'city': 'Dummy City', 'name': 'John Doe', 'phone': '+00000000000', 'street': 'Dummy Street', 'country': 'XX', 'lastName': 'Doe', 'postcode': '00000', 'firstName': 'John'}, 'shippingMethodRef': 'XXX000'}]}}
]

我想将所有结果放在单独的列中,例如

sfcc.created_by  shippingLines
DummyUser        {'code': 'DUMMYCODE', 'price': '0', 'discountedPrice': '0'}

pyspark apache-spark-sql databricks
1个回答
0
投票

使用

col.explode
函数将是一个很好的起点。您可能需要多次调用它才能解压缩这些值。我不知道你的数据有多少层嵌套。

但是,在 pyspark 中,它应该看起来像这样:

attributes = df.select(explode(df.attributes))
shippingLines = attributes.select(explode(attributes.shippingLines))
© www.soinside.com 2019 - 2024. All rights reserved.