explode () не работает должным образом в python с искрой для вложенных JSON - PullRequest
1 голос
/ 26 мая 2020

Мой вложенный JSON выглядит так, как показано ниже.

{
"dc_id": "dc-101",
"source": {
    "sensor-igauge": {
      "id": 10,
      "ip": "68.28.91.22",
      "description": "Sensor attached to the container ceilings",
      "temp":35,
      "c02_level": 1475,
      "geo": {"lat":38.00, "long":97.00}                        
    },
    "sensor-ipad": {
      "id": 13,
      "ip": "67.185.72.1",
      "description": "Sensor ipad attached to carbon cylinders",
      "temp": 34,
      "c02_level": 1370,
      "geo": {"lat":47.41, "long":-122.00}
    }}}

У меня также есть схема для приведенных выше данных.

schema = StructType([
  StructField("dc_id", StringType(),True),                              
  StructField("source",MapType(StringType(),StructType([
    StructField("description",StringType(),True),
    StructField("ip",StringType(),True),
    StructField("id",StringType(),True),
    StructField("temp",StringType(),True),
    StructField("c02_level",StringType(),True),
    StructField("geo",StructType([
      StructField("lat",DoubleType(),True),
      StructField("long",DoubleType(),True),
    ]),True)
  ])),True)])

Я хочу знать, как использовать эту схему в python для отображения данных. У меня был такой код.

dataDS = (scSpark.createDataFrame(
            [({
"dc_id": "dc-101",
"source": {
    "sensor-igauge": {
      "id": 10,
      "ip": "68.28.91.22",
      "description": "Sensor attached to the container ceilings",
      "temp":35,
      "c02_level": 1475,
      "geo": {"lat":38.00, "long":97.00}                        
    },
    "sensor-ipad": {
      "id": 13,
      "ip": "67.185.72.1",
      "description": "Sensor ipad attached to carbon cylinders",
      "temp": 34,
      "c02_level": 1370,
      "geo": {"lat":47.41, "long":-122.00}
    }}})]))

dataDS.select("dc_id","source",explode(format("source")).alias("sensor_name","sensor_value"))\
.select("dc_id","source","sensor_name","sensor_value",explode("sensor_value")).show()

Обратите внимание, что вместо format () я раньше использовал parse (), но получил NameError: имя 'parser' не определено . Я также пытался запустить это, используя из импорта парсера *, но получал ту же ошибку.

Результат был примерно таким, что не так, как ожидалось. Please check the result output

ip, description и geo имеют значение null.

Любая идея, как я могу справиться с этим в pyspark или с помощью python, мне нужны все значения с вложенные значения для географического ключа. Данные типа String и Struct не поступают.

...