当前位置: 首页 > 知识库问答 >
问题:

当struct type的struct字段与spark scala中的特定值匹配时,从structs数组中检索struct

巢德华
2023-03-14
Schema

root
|-- promotion-id: string (nullable = true)
|-- custom-attributes: struct (nullable = true)
|    |-- custom-attribute: array (nullable = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- value: string (nullable = true)
|    |    |    |-- attribute-id: string (nullable = true)


Sample Input Data 

promotion-id    custom-attributes.custom-attribute
100             [["x",1000],["y",2000]]
200             [["x",3000],["z",4000]]

Sample Output

promotion-id    col X   col Y   col Z
100             1000    2000    null
200             3000    null    4000

我正在使用spark 2.3,我有一个具有以下模式的数据框架

如果您注意到自定义属性。自定义属性是数组(struct)

现在,我将属性ID设置为“x”。我需要检查属性ID“x”是否存在于数组中的任何结构中,并获取值输出。

我有一个属性ID和列名的列表

假设-如果属性ID为“x”,则获取其值并填充到x列中

下面是属性ID到列的映射x-

如果结构中没有可用的属性,那么只需在该列中设置为null

共有1个答案

葛季萌
2023-03-14

您可以内联结构数组,并对值进行透视。

val df2 = df.selectExpr(
    "*", 
    "inline(`custom-attributes`.`custom-attribute`)"
).groupBy("promotion-id").pivot("value").agg(first(col("attribute-id")))

df2.show
+------------+----+----+----+
|promotion-id|   x|   y|   z|
+------------+----+----+----+
|         100|1000|2000|null|
|         200|3000|null|4000|
+------------+----+----+----+

请注意,使用反勾号可以转义列名中的连字符。通常,在列名中使用连字符不是一种好的做法,因为它们也可能意味着列的减法。

 类似资料:
  • 问题内容: 我有对象的Postgres JSONB数组,看起来像这样: 此JSONB是一个函数参数。 什么是最有效的检索方法 。 我尝试过玩,但是到目前为止我所做的一切看起来都非常混乱。 问题答案: 在 Postgres 9.4+中 ,可以在横向 联接中 使用该函数: 您可以通过一个简单的函数来实现该想法,例如: 在 Postgres 12+中, 您可以使用jsonb路径函数的形式来替代: Db

  • 我已经做了几个小时的实验和研究,试图找到一种方法来实现这一点,但我只是没有任何运气。 因此,我有几种不同的自定义帖子类型需要混合一下。让我试着尽可能清晰和经济地解释它。 有2种自定义帖子类型,消息 因此,目前,我在一个“校园”的单一帖子中,试图查询和获取最新的消息帖子,这是有效的。但是,然后我尝试只针对消息post中特定中继器行的值并将其拉入。消息中的转发器字段是一个校园选择(基于“校园”帖子类型

  • 问题内容: 我试图学习有关MySQL的更多信息,并使用Java(在Android上)从WAMS服务器上的数据库访问和检索信息。我的应用程序的设置方式是它具有一个初始登录屏幕,该屏幕还捕获(从另一个表中)登录的用户名的“ uid”并进行存储。 登录后(功能正常- 我设置了一个敬酒通知,其中显示了登录用户的检索到的用户名和uid),它会转到一个新屏幕(dashboard.xml),该屏幕具有一个Tex

  • 我有一个用Java编写的管理应用程序,可以管理我的用户 我创建了一个自定义json 这就是我的JSON看起来的样子 在我的列表中,我只显示电子邮件地址 现在我的问题,例如,如果我单击包含电子邮件的列表,我想在对话框中显示与此电子邮件相关的数据,即、和 怎样​​我可以检索其他值吗​​使用电子邮件? 我在网上找不到任何关于它的信息

  • 问题内容: 我正在使用一个每个键有两个值的Multimap。下面是我用来分别获取每个值的代码: 代码的第一位获取第一个对象值: 然后,我正在使用另一种方法来检索其他值。此方法将第一个对象作为参数: 这似乎是一种“骇人的”做事方式,那么我有什么办法可以更轻松地获得价值? 问题答案:

  • 本文向大家介绍sharepoint项目。从指定数量的项目中检索特定字段,包括了sharepoint项目。从指定数量的项目中检索特定字段的使用技巧和注意事项,需要的朋友参考一下 示例