如何将SQL中的行拆分为单独的编号行?

时间:2017-09-26 19:02:00

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

(SQL风格是Spark-native SQL)假设我有一行如:

**userId** : String | **assignedEntities** : String
JOHN | "ENTITY_1,ENTITIY_2,...,ENTITY_100"

我想把它分成2个大小的“分块”列表,但用不同的键来识别它们:

**userId** | **assignedEntities**
JOHN_1 | "ENTITY_1,ENTITIY_2"
JOHN_2 | "ENTITY_2,ENTITY_3"
...

重要的是要在这里更改密钥以避免以后发生冲突,我不确定如何使用explode()之类的东西完成这两项工作。

有什么建议吗?

注意:assignedEntities是一个字符串,但我对我的正则表达式魔术足够舒服,可以根据需要将其拆分(一旦我有一个方法可以拆分它)

2 个答案:

答案 0 :(得分:0)

这样的事情应该这样做:

select user_id, concat(entity_1 || ',' || entity_2)
union all
select user_id, concat(entity_2 || ',' || entity_3)
order by
user_id

答案 1 :(得分:0)

专栏" assignedEntities"可以拆分,并用" posexplode"爆炸功能:

val df = List(("JOHN", "ENTITY_1,ENTITY_2,ENTITY_3,ENTITY_4")).toDF("userId", "assignedEntities")

val splited = df.withColumn("assignedArray", split($"assignedEntities", ","))
val exploded = splited.select($"userId", posexplode($"assignedArray"))
val result = exploded.select(concat($"userId", lit("_"), $"pos".plus(1)).as("userId"), $"col".as("assignedEntities"))

result.show(false)

输出:

+------+----------------+
|userId|assignedEntities|
+------+----------------+
|JOHN_1|ENTITY_1        |
|JOHN_2|ENTITY_2        |
|JOHN_3|ENTITY_3        |
|JOHN_4|ENTITY_4        |
+------+----------------+

在此示例列中,按","拆分。如果您对注释中提到的正则表达式感到满意,请使用适当的表达式。或者可以使用用于分割的自定义UDF代替" split"