Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Spark dataframe上的Pivot仅在几列中的一列上返回意外的空值_Sql_Scala_Apache Spark - Fatal编程技术网

Sql Spark dataframe上的Pivot仅在几列中的一列上返回意外的空值

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|

我已经旋转了一个Spark数据帧,它可以正确地用于除一列之外的所有列,尽管它们几乎完全相同

我有一个数据框,看起来像这样:

+-------+------------+---------+
|     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展平。