gpt4 book ai didi

java - 尝试使用 SPARK 1.6 (WrappedArray) 从嵌套 JSON 中收集值

转载 作者:行者123 更新时间:2023-12-02 00:48:38 28 4
gpt4 key购买 nike

我正在尝试转换 Dataframe 中的 json 文件,但我陷入了基于数组的字段中。我正在使用 Spark 1.6 和 Java。当我读取嵌套的 Json 并转换为 Dataframe 时,我可以读取一些字段,但是当我尝试输入特定路径时会显示错误。

DataFrame df = spark.read().json(sc.wholeTextFiles("PATH").values());

我正在读取一个 json 文件。

df.select(col("orcamentos.itens")).printSchema();

root
|-- itens: array (nullable = true)
| |-- element: array (containsNull = true)
| | |-- element: struct (containsNull = true)
| | | |-- criticas: array (nullable = true)
| | | | |-- element: struct (containsNull = true)
| | | | | |-- codigo: long (nullable = true)
| | | | | |-- codigoCenario: string (nullable = true)
| | | | | |-- codigodevolutiva: long (nullable = true)
| | | | | |-- descricao: string (nullable = true)
| | | | | |-- flagLiberacao: string (nullable = true)
| | | | | |-- statusCenario: string (nullable = true)
| | | |-- devolutivas: array (nullable = true)
| | | | |-- element: struct (containsNull = true)
| | | | | |-- codigo: long (nullable = true)
| | | | | |-- descricao: string (nullable = true)
| | | | | |-- texto: string (nullable = true)
| | | | | |-- tipo: struct (nullable = true)
| | | | | | |-- codigo: long (nullable = true)
| | | | | | |-- descricao: string (nullable = true)
| | | |-- numeroItem: long (nullable = true)
| | | |-- rastreador: struct (nullable = true)
| | | | |-- concessao: struct (nullable = true)
| | | | | |-- codigo: long (nullable = true)
| | | | | |-- descricao: string (nullable = true)
| | | | |-- dispositivo: struct (nullable = true)
| | | | | |-- codigo: long (nullable = true)
| | | | | |-- descricao: string (nullable = true)

我正在尝试使用以下命令打印字段“numeroItem”:

df.select(col("orcamentos.itens.numeroItem")).show();

但我收到以下错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'orcamentos.itens[numeroItem]' due to data type mismatch: argument 2 requires integral type, however, 'numeroItem' is of string type.;
at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:65)
at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57)

当我尝试仅打印上面的节点(numeroItem 的父亲)时,从数据帧返回列,如下所示:

df.select(col("orcamentos.itens")).show();

+---------------------------------------+
|itens |
+---------------------------------------+
|[WrappedArray([WrappedArray([5000,3,4,D|
+---------------------------------------+

如果该字段由 WrappedArray 组成,我该如何使用它?稍后,我需要动态爆炸该字段/数组。

最佳答案

如果你可以修改json输入,你可以这样做:

在 json 文件中,数组位于一个大对象内。为了使 Spark 能够将数组视为 DataFrame 中的单独行,您应该将数组作为根元素。

所以不是{"itens":[<element1>,...,<elementN>]} ,而是[<element1>, ..., <elementN>]

关于java - 尝试使用 SPARK 1.6 (WrappedArray) 从嵌套 JSON 中收集值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com