[英]How to extract an element from a array in pyspark
我有以下類型的數據框:
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|
#+----+----+----+----+----+
您有 4 個選項來提取數組中的值:
df = spark.createDataFrame([[1, [10, 20, 30, 40]]], ['A', 'B'])
df.show()
+---+----------------+
| A| B|
+---+----------------+
| 1|[10, 20, 30, 40]|
+---+----------------+
from pyspark.sql import functions as F
df.select(
"A",
df.B[0].alias("B0"), # dot notation and index
F.col("B")[1].alias("B1"), # function col and index
df.B.getItem(2).alias("B2"), # dot notation and method getItem
F.col("B").getItem(3).alias("B3"), # function col and method getItem
).show()
+---+---+---+---+---+
| A| B0| B1| B2| B3|
+---+---+---+---+---+
| 1| 10| 20| 30| 40|
+---+---+---+---+---+
如果您有很多列,請使用列表推導:
df.select(
'A', *[F.col('B')[i].alias(f'B{i}') for i in range(4)]
).show()
+---+---+---+---+---+
| A| B0| B1| B2| B3|
+---+---+---+---+---+
| 1| 10| 20| 30| 40|
+---+---+---+---+---+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.