![](/img/trans.png)
[英]Pivot table returns multiple rows with NULLs, are not grouped on one row
[英]Pivot on Spark dataframe returns unexpected nulls on only one of several columns
我已經旋轉了一個 Spark dataframe,它適用於除一列之外的所有列,即使它們幾乎完全相同。
我有一個 dataframe 看起來像這樣:
+-------+------------+---------+
| id| cf_id| value|
+-------+------------+---------+
|3688634|300016666252|telephone|
|3688634|300019829932| false|
|3688307|300016666252| email|
|3688307|300019829932| false|
|3688635|300016666252|telephone|
|3688635|300019829932| false|
(有 29 個不同的 cf_id 值,但在此示例中只有兩個)
當我運行時:
df.groupBy("id").pivot("cf_id").agg(first("value")).show
我希望看到:
+-------+------------+------------+
| id|300016666252|300019829932|
+-------+------------+------------+
|3634121| email| false|
|3634192| email| true|
|3634216| email| true|
|3634319| email| true|
|3634423| email| false|
|3634749| email| true|
|3635192| telephone| false|
除此處顯示的最后一列 (300019829932) 外,所有列均正常工作,它將所有值轉換為 null。
I've extracted the single problem column as a separate dataframe and ran the pivot function on it, which transforms all the values to null.
我在另一列上運行了相同的 function,它按預期工作。
兩列都有一個數據字符串,它們的名稱是 12 位數字的字符串(稍后會別名)。
我認為這不可能是因為整個列名都是數字,因為它適用於除一個之外的所有列名。 我還嘗試將 collect_set 作為 pivot 聚合 function,它返回一個空集。
Spark 版本 2.2.0.2.6.4.0-91
Scala 版本 2.11.8(Java HotSpot(TM) 64 位服務器 VM,Java 1.8.0_77)
我在這里錯過了什么嗎? 列之間的標題和值非常相似,應用於它們的函數完全相同,但列始終返回 null 值。
看起來問題是由於列中存在真/假/空值。
在 pivot function 的某個地方,它沒有處理看似 boolean 類型的三個值,並將所有內容歸零。
因此,(給定一個只有 boolean cf_id 值的表),當將值轉換為 boolean 時,它可以工作。
val castdf = spark.sql("""select id, cf_id, cast(value as boolean) as value from df""")
castdf.groupBy($"id").pivot("cf_id").agg(first($"value")).show
+-------+------------+
| id|360019829932|
+-------+------------+
|3663762| false|
|3619941| null|
|3667500| false|
|3631088| null|
|3668712| false|
|3661298| true|
我對 spark 和 SQL 還很陌生,所以我無法解釋原因。
但總而言之:
如果您正在轉向 Spark dataframe,它將有一個包含真/假/空值的字符串類型列,則值來自的列應轉換為 boolean。
謝謝@rbcvl 的幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.