python - 如何从pyspark中的数组中提取元素

标签 python apache-spark pyspark rdd

我有一个具有以下类型的数据框:

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。

最佳答案

创建示例数据:

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|
#+----+----+----+----+----+

关于python - 如何从pyspark中的数组中提取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45254928/

相关文章:

java.lang.ClassNotFoundException : org. 用于 Spark 3.0.0 的 apache.spark.sql.sources.v2.DataSourceV2

sql - Spark SQL : Extract String before a certain character

python - 如何为 Python Rust+ API 包装器建立 Websocket 连接

scala - 确保在应用程序中仅确保一个Spark上下文的良好实践

java - 使用 Spark java 从 Alluxio 读取多个文件很慢

python - 在 pyspark 中选择包含字符串的列

python - 如何根据另一个行字符串重命名行字符串?

python - 在单个 DataFrame 中查找子行而不使用循环

python - 通过另外两个列表对 Python (numpy) 中的数组进行排序

hadoop - 从 spark master UI 清除 Spark Job 历史记录