Невозможно получить столбец Json с помощью sparkDataframe: org. apache .spark. sql .AnalysisException: невозможно разрешить 'explode; - PullRequest
0 голосов
/ 10 июля 2020

Может ли кто-нибудь помочь мне в этом сценарии. Я читаю один Json файл, используя spark / scala, а затем пытаюсь получить доступ к имени столбца, но при доступе к имени столбца я получаю сообщение об ошибке ниже.

     org.apache.spark.sql.AnalysisException: cannot resolve 
    'explode(`b2b_bill_products_prod_details`.`amt`)' 
    due to data type mismatch: input to function explode should be 
     array or map type, not DoubleType;;
     

См. Схему Json и мой код ниже.

     root
     |-- b2b: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- add1: string (nullable = true)
     |    |    |-- bill: array (nullable = true)
     |    |    |    |-- element: struct (containsNull = true)
     |    |    |    |    |-- amt: double (nullable = true)
     |    |    |    |    |-- products: array (nullable = true)
     |    |    |    |    |    |-- element: struct (containsNull = true)
     |    |    |    |    |    |    |-- prod_details: struct (nullable = true)
     |    |    |    |    |    |    |    |-- amt: double (nullable = true)

Я хочу получить доступ к полю amt (последняя строка в схеме json) Я пишу ниже spark / scala код

    df.withColumn("b2b_bill",explode($"b2b.bill"))
    .withColumn("b2b_bill_products",explode($"b2b_bill.products"))
    .withColumn("b2b_bill_products_prod_details", explode($"b2b_bill_products.prod_details"))
    .withColumn("b2b_bill_products_prod_details_amt",explode($"b2b_bill_products_prod_details.amt"))

1 Ответ

0 голосов
/ 10 июля 2020

Ваша 4-я функция explode применяется к столбцу amt: double, при этом функция разнесения ожидает тип ввода array/map. Это сообщение об ошибке.

Изменить

Вы можете получить доступ к самому внутреннему полю amt с выражением, приведенным ниже,

df.withColumn("b2b_bill",explode($"b2b.bill"))
  .withColumn("b2b_bill_products",explode($"b2b_bill.products"))
  .withColumn("b2b_bill_products_prod_details_amt", $"b2b_bill_products.element.prod_details.amt")
...