[英]Multiple comma delimited values to separate row in Spark Java
我有以下數據集。 Column_1
逗號分隔, Column_2
和Column_3
用冒號分隔。 都是字符串列。 Column_1 中的每個逗號分隔值都應該是Column_1
中的單獨行, Column_3
應該填充Column_2
或Column_1
中的等效值。 column_2
或column_3
將被填充,並且不會同時填充兩者。
如果Column_1
中的值的數量與column_2
或column_3
中的等效值的數量不匹配,那么我們必須填充 null ( Column_1
: I,J
和K,L
)
Column_1 Column_2 Column_3
A,B,C,D NULL N1:N2:N3:N4
E,F N5:N6 NULL
G NULL N7
H NULL NULL
I,J NULL N8
K,L N9 NULL
我必須將分隔值轉換為如下行。
Column_1 Column_2
A N1
B N2
C N3
D N4
E N5
F N6
G N7
H NULL
I N8
J NULL
K N9
L NULL
有沒有辦法在不使用 UDF 的情況下在 Java spark API 中實現這一點。
Scala 解決方案...應該在 Java 中類似。 您可以使用coalesce
組合第 2 列和第 3 列,使用適當的分隔符將它們拆分,使用arrays_zip
進行轉置explode
並將結果分解為行。
df.select(
explode(
arrays_zip(
split(col("Column_1"), ","),
coalesce(
split(coalesce(col("Column_2"), col("Column_3")), ":"),
array()
)
)
).alias("result")
).select(
"result.*"
).toDF(
"Column_1", "Column_2"
).show
+--------+--------+
|Column_1|Column_2|
+--------+--------+
| A| N1|
| B| N2|
| C| N3|
| D| N4|
| E| N5|
| F| N6|
| G| N7|
| H| null|
| I| N8|
| J| null|
| K| N9|
| L| null|
+--------+--------+
這是另一種方式,使用transform
function 可以迭代column_1
的元素並創建稍后分解的 map:
df.withColumn(
"mappings",
split(coalesce(col("Column_2"), col("Column_3")), ":")
).selectExpr(
"explode(transform(split(Column_1, ','), (x, i) -> map(x, mappings[i]))) as mappings"
).selectExpr(
"explode(mappings) as (Column_1, Column_2)"
).show()
//+--------+--------+
//|Column_1|Column_2|
//+--------+--------+
//| A| N1|
//| B| N2|
//| C| N3|
//| D| N4|
//| E| N5|
//| F| N6|
//| G| N7|
//| H| null|
//| I| N8|
//| J| null|
//| K| N9|
//| L| null|
//+--------+--------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.