簡體   English   中英

Spark dataframe 上的 Pivot 僅在幾列之一上返回意外的空值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM