(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是一个字符串,但我对我的正则表达式魔术足够舒服,可以根据需要将其拆分(一旦我有一个方法可以拆分它)
答案 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"