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

Pyspark-将结构列合并到数组中

慕容宏邈
2023-03-14

我想将多个结构列合并成一个数组。

我从..尝试了数组(col1,col2),但结果是数据类型不匹配,即使所有结构列都是相同的类型。

查询-

< code > select array(struct(f_name _ add,True as is_data_found),struct(l_name_add,True as is_data_found))作为标记from (select array(map('value ',f _ name),map('value ',f_add))作为f_name_add,array(map('value ',l_name),map('value ',l_add))作为l_name _ add from(select distinct f _ name,f_add,l _ name,l _ add from db . tab 1,其中id = '

输入

Sample Table

 id   f_name  f_add  l_name  l_add

 aaa  tom    in     nats    in

预期产出:

"tag":
 [
       {
            "f_name_add": [
                {
                    "value":"tom"
                },
                {
                    "value": "in"
                }
            ],
            "is_data_found": true
        },
        {
         "l_name_add": [
                {
                    "value":"nats"
                },
                {
                    "value": "in"
                }
            ],
            "is_data_found": true
        }
]

错误:

< code >无法解析“array(named_struct('f_name_add ',__auto_generated_subquery_name。f_name_add,' is_data_found ',true),named_struct('l_name_add ',__auto_generated_subquery_name。l_name_add,' is_data_found ',true))'由于数据类型不匹配:函数数组的输入应该都是同一类型,但它是[struct


共有1个答案

葛兴发
2023-03-14

看起来像错误消息说有两个结构

由于f_name_addl_name_add,它们彼此之间并不相等。

在这里,我将尝试创建一个json字符串数组,我不确定这是否正是您想要的,尽管:(

  1. 设置一个简单的示例
a = [('aaa', 'tom', 'in', 'nats', 'in'),('bbb', 'tom1', 'on', 'nats1', 'on'),]
df = spark.createDataFrame(a, ['id', 'f_name',  'f_add',  'l_name', 'l_add'])
df.show()


+---+------+-----+------+-----+
| id|f_name|f_add|l_name|l_add|
+---+------+-----+------+-----+
|aaa|   tom|   in|  nats|   in|
|bbb|  tom1|   on| nats1|   on|
+---+------+-----+------+-----+

df.registerTempTable("tabl1")
df = spark.sql("select array(to_json(struct(f_name_add, True as is_data_found)), \
                             to_json(struct(l_name_add, True as is_data_found))) as tag \
                from (select array(map('value',f_name),map('value',f_add)) as f_name_add, \
                       array(map('value',l_name),map('value',l_add)) as l_name_add \
                from (select distinct f_name, f_add, l_name, l_add from tabl1 where id = 'aaa'))")

df.show(truncate=False)

+------------------------+
|tag                                                                                                                                          |
+------------------------+
|[{"f_name_add":[{"value":"tom"},{"value":"in"}],"is_data_found":true}, {"l_name_add":[{"value":"nats"},{"value":"in"}],"is_data_found":true}]|
+------------------------+

如果您运行< code>df.dtypes,我们将有,您可以看到我们实际上有一个json字符串数组。

[('tag', 'array<string>')]
 类似资料:
  • 我有下面的数据帧模式作为df.current模式,需要获得预期的模式作为df.expected模式,有没有一种方法,我可以在火花2.3实现这一点 df.current架构: df。预期架构: 示例数据: 注意:这里需要实现两件事: 为元素中的每个E、V对创建新字段SN,其值应为数组名称。例如:对于第一个数组列(ADA),SN的值=ADA 将阵列(ADA、ADW)合并为一个外部阵列(信号)

  • 我有一个结构数组 我希望合并并按升序排序数组。然而,当我执行合并时,没有任何变化。这是我用来创建struct数组的代码,以及MergeSort的函数调用。最大用户数是我从二叉树中转换节点数得到的整数,它应该是数组的最大数量。 任何提示或提示都将不胜感激! 编辑:当我尝试编写一些printf语句时,我注意到这些值是负数。但是存储在结构中的值是正数。这个错误的原因是什么?

  • 我有两个数据帧,我需要连接一列,如果id包含在第二个数据帧的同一列中,则只从第一个数据帧中获取行: df1: 断续器: 期望输出: 我已经用df1.join(df2("id ")," left ")试过了,但是给我错误:“Dataframe”对象是不可调用的。

  • 问题内容: 我有以下数据 我得到一个 到目前为止,很好,我有一个数据结构,可以按列名进行寻址 下一个步骤,问题- 我有一个功能,在输入有地理坐标(的两个向量和当然的),并返回两个阵列和在地图上突出位置(此工程确定)。 我可以使用单独的向量,但是我想添加两个新列和。我的天真尝试 提出了一个,教我说它具有字典的某些特征,但是字典却没有。 我可以做吗?tia 请考虑这不适用于结构化数组或记录数组,大多数

  • 问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet

  • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。