Sql Spark dataframe上的Pivot仅在几列中的一列上返回意外的空值
我已经旋转了一个Spark数据帧,它可以正确地用于除一列之外的所有列,尽管它们几乎完全相同 我有一个数据框,看起来像这样:Sql Spark dataframe上的Pivot仅在几列中的一列上返回意外的空值,sql,scala,apache-spark,Sql,Scala,Apache Spark,我已经旋转了一个Spark数据帧,它可以正确地用于除一列之外的所有列,尽管它们几乎完全相同 我有一个数据框,看起来像这样: +-------+------------+---------+ | id| cf_id| value| +-------+------------+---------+ |3688634|300016666252|telephone| |3688634|300019829932| false| |3688307|300016666252|
+-------+------------+---------+
| 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
我已将单个问题列提取为一个单独的数据帧,并在其上运行pivot函数,该函数将所有值转换为null。我在另一列上运行了相同的函数,其效果与预期一致。
两个列都有一个数据字符串,它们的名称是12位的字符串(后面有别名)。
我认为这不可能是因为整个列名都是数字,因为它适用于除一个以外的所有列。 我还尝试将collect_set作为pivot聚合函数,它返回一个空集 Spark版本2.2.0.2.6.4.0-91
Scala版本2.11.8(Java热点(TM)64位服务器虚拟机,Java 1.8.077)
我是不是遗漏了什么?各列的标题和值非常相似,应用于它们的函数完全相同,但该列始终返回空值。问题似乎是由于列中存在真/假/空值 在pivot函数的某个地方,它没有处理看似布尔类型的三个值,也没有将所有值都置零 因此,(给定一个只包含布尔cf_id值的表),当将该值转换为布尔值时,它会起作用
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数据帧,该数据帧将有一个包含真/假/空值的字符串类型列,则值来自的列应转换为布尔值
感谢@rbcvl作为新的投稿人提供的帮助,如果投票失败的人能告诉我我做错了什么,我将不胜感激。您能在转换后检查此特定列的数据类型吗?pivot前后的字符串类型。Value列是string,300019829932(null列)是string类型。您是否有另一个满是
true
和false
的列,您的代码正在为其工作?我不确定这个问题有多详细,所以要补充一点:cf_id和Value列是JSON文件中的结构数组。数组用id列分解,然后通过选择id、.cf_id、.value展平。