使用Spark访问嵌套在结构中的json数组

使用Spark访问嵌套在结构中的json数组,json,scala,apache-spark,Json,Scala,Apache Spark,我希望从一个嵌套相当深的数组结构中访问不同的字段/子字段,以便对它们进行算术运算。一些数据实际上在字段名本身中(我必须访问的结构就是这样创建的,对此我无能为力)。特别是,我有一个数字列表作为我必须使用的字段名,这些数字将从一个json文件更改为下一个json文件,因此我必须动态推断这些字段名是什么,然后将它们与子字段值一起使用 我已经看过了: 不幸的是,我不知道我的结构的字段名是什么,所以我不能使用它 我也尝试过这个,看起来很有希望: 不幸的是,无论“flatte”函数的魔力如何,我都无法将其应

我希望从一个嵌套相当深的数组结构中访问不同的字段/子字段,以便对它们进行算术运算。一些数据实际上在字段名本身中(我必须访问的结构就是这样创建的,对此我无能为力)。特别是,我有一个数字列表作为我必须使用的字段名,这些数字将从一个json文件更改为下一个json文件,因此我必须动态推断这些字段名是什么,然后将它们与子字段值一起使用

我已经看过了: 不幸的是,我不知道我的结构的字段名是什么,所以我不能使用它

我也尝试过这个,看起来很有希望: 不幸的是,无论“flatte”函数的魔力如何,我都无法将其应用于字段名,而不是字段本身

下面是一个json数据集示例。它代表消费篮子:

  • “comp A”和“comp B”这两个篮子中的每一个篮子都有许多子字段的价格:compA'55.80'是一个价格,compA'132.88'是另一个价格,等等
  • 我希望将这些单价与其各自子字段中的可用数量相关联:compA'55.80'。注释[0]。数量(500)以及compA'55.80'。注释[0]。数量(600)都应与55.80相关联。compA'132.88'。注释[0]。数量(700)应与132.88关联。等等
我希望在数据帧中获取所有这些数字,以便对它们执行一些操作:

+ -------+---------+----------+
+ basket | price   | quantity +
+ -------+---------+----------+
+ comp A | 55.80   | 500      +
+ comp A | 55.80   | 600      +
+ comp A | 132.88  | 700      +
+ comp A | 0.03    | 500      +
+ comp A | 0.03    | 600      +
+ comp B | 55.70   | 500      +
+ comp B | 55.70   | 600      +
+ comp B | 132.98  | 300      +
+ comp B | 132.98  | 900      +
+ comp B | 0.01    | 400      +
+ -------+---------+----------+
原始数据集的访问方式如下:

scala> myDs
res135: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [products: struct<baskets: struct<compA: struct<55.80: array<struct .....
scala>myDs

res135:org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]=[products:struct这种处理以列名形式输入的数据的方法不是一种可以遵循的方法。它根本不起作用。

我正在使用以下内容取得一些进展:spark.read.json(myDs.withColumn(“compA”,get_json_object($“json”),“$.products.baskets.compA”)).select(“compA”).rdd.map(u.getString(0))。这将生成以下列:Array[String]=Array(55.80,132.88,0.03,…这还不够,但这是一个开始…这应该给你一些指导。爆炸式需求。在这方面有什么乐趣吗?主要的困难是:1.我不知道模式,因为价格发生了变化;2.价格是字段名。除非我弄错了,使用您链接的示例因此,在这方面,使用电影是没有帮助的?我举的例子非常直截了当。你需要了解一些关于模式的知识。我还没有完全放弃(因为我对数据格式没有控制权,数据就在那里…)。我会发布更新。这对你很好,但确实很难。这个答案说明这是不可能的,但没有说明为什么不可能。事实上,我非常确定这是可能的=>我更喜欢那个人(可能是我)找到实际答案并将其发布在这里,以记录/帮助他人。然后我期待有一天能得到答案。我注意到,这个平台上有很多专家,比我强得多,到目前为止没有回应。解决了吗?如果有,请发布。
scala> myDs
res135: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [products: struct<baskets: struct<compA: struct<55.80: array<struct .....