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