2017-09-26 45 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來代替「拆分」

相關問題