【问题标题】:Select key column from data as null if it doesn't exist in pyspark如果 pyspark 中不存在,则从数据中选择键列为 null
【发布时间】:2019-09-12 09:59:40
【问题描述】:

我的数据框(df)的结构如下:

root
 |-- val1: string (nullable = true)
 |-- val2: string (nullable = true)
 |-- val3: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _type: string (nullable = true)
 |    |    |-- key: string (nullable = true)
 |    |    |-- value: string (nullable = true)

我有两条样本记录如下:

+------+------+-----------------------------------+
| val1 | val2 |               val3                |
+------+------+-----------------------------------+
|  A   |  a   |     {k1: A1, k2: A2, k3: A3}      |
+------+------+-----------------------------------+
|  B   |  b   |                {k3: B3}           |
+------+------+-----------------------------------+

我正在尝试从中选择数据,如下所示:

df.select(val1,val2,val3.k1,val3.k2,val3.k3)

我希望我的输出看起来像:

+------+------+---------+---------+---------+
| val1 | val2 |    k1   |   k2    |   k3    |
+------+------+---------+---------+---------+
|  A   |  a   |   A1    |   A2    |   A3    |
+------+------+-----------------------------+
|  B   |  b   |  NULL   |  NULL   |   B3    |
+------+------+-----------------------------+

但由于我没有所有记录的键 k1 和 k2,因此 select 语句会引发错误。我该如何解决这个问题?我对 pyspark 比较陌生。

【问题讨论】:

  • 你能说明在达到这个状态之前你对这个数据框做了什么样的转换吗? val3 是一个结构数组,看起来不正确,我无法复制创建相同的架构。通常,查看您的数据 val3 应该是映射或结构
  • 不好意思,val3是一个数组,数据如下:+------+------+---------- -------------------------+ | val1 | val2 | val3 | +------+------+------------------------------------ + |一个 |一个 | [[k1:A1],[k2:A2],[k3:A3]] | +------+------+------------------------------------ + |乙|乙 | [[k3: B3]] | +------+------+------------------------------------ +
  • 我基本上是想将数组分解成 pyspark 中的列

标签: pyspark apache-spark-sql pyspark-sql


【解决方案1】:

我认为你可以使用

df.selectExpr('val3.*')

让我知道这是否有效

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2013-06-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多