2017-09-26 47 views
0

(SQL味火花本地SQL)说我有一排如:如何将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

像这样的东西应该这样做:

select user_id, concat(entity_1 || ',' || entity_2) 
union all 
select user_id, concat(entity_2 || ',' || entity_3) 
order by 
user_id 
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来代替“拆分”

相关问题