【问题标题】:How to extract an element from a array in pyspark如何从pyspark中的数组中提取元素
【发布时间】:2017-12-28 12:35:41
【问题描述】:

我有以下类型的数据框

col1|col2|col3|col4
xxxx|yyyy|zzzz|[1111],[2222]

我希望我的输出遵循类型

col1|col2|col3|col4|col5
xxxx|yyyy|zzzz|1111|2222

我的 col4 是一个数组,我想将其转换为单独的列。需要做什么?

我看到很多关于 flatmap 的答案,但它们都在增加一行,我只想将元组放在另一列但在同一行中

以下是我的实际架构:

root
 |-- PRIVATE_IP: string (nullable = true)
 |-- PRIVATE_PORT: integer (nullable = true)
 |-- DESTINATION_IP: string (nullable = true)
 |-- DESTINATION_PORT: integer (nullable = true)
 |-- collect_set(TIMESTAMP): array (nullable = true)
 |    |-- element: string (containsNull = true)

也可以请人帮我解释一下数据框和 RDD

【问题讨论】:

  • 你的数据框的架构是什么?你能显示 df.printSchema() 吗?
  • 嗨,我用我的实际架构编辑了这个问题
  • 数组列中的所有单元格是否具有相同数量的元素?总是2?如果另一行在数组中有三个元素怎么办?
  • 并非所有元素都恰好有 2 个元素。因为数组中的元素是开始日期和结束日期。
  • 如果你能帮助我,这也是我的实际要求。 stackoverflow.com/questions/45252906/…

标签: python apache-spark pyspark rdd


【解决方案1】:

创建示例数据:

from pyspark.sql import Row
x = [Row(col1="xx", col2="yy", col3="zz", col4=[123,234])]
rdd = sc.parallelize([Row(col1="xx", col2="yy", col3="zz", col4=[123,234])])
df = spark.createDataFrame(rdd)
df.show()
#+----+----+----+----------+
#|col1|col2|col3|      col4|
#+----+----+----+----------+
#|  xx|  yy|  zz|[123, 234]|
#+----+----+----+----------+

使用getItem 从数组列中提取元素,在您的实际情况下,将col4 替换为collect_set(TIMESTAMP)

df = df.withColumn("col5", df["col4"].getItem(1)).withColumn("col4", df["col4"].getItem(0))
df.show()
#+----+----+----+----+----+
#|col1|col2|col3|col4|col5|
#+----+----+----+----+----+
#|  xx|  yy|  zz| 123| 234|
#+----+----+----+----+----+

【讨论】:

  • @Lydia 请非常小心并确保您知道在更改代码时您在做什么:您的编辑破坏了一个非常好的答案,导致它抛出异常(恢复它是OP的原版)...
  • 你有办法泛化对原始 col4 数组的迭代吗?
  • @Amesys 你有没有尝试解构列表理解?
  • 我有一个后续问题,删除链接,提前谢谢! stackoverflow.com/questions/61823544/…@Psidom
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2021-12-22
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多