Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark Join in Spark返回重复的隐式数据类型don';不匹配_Apache Spark_Join_Types - Fatal编程技术网

Apache spark Join in Spark返回重复的隐式数据类型don';不匹配

Apache spark Join in Spark返回重复的隐式数据类型don';不匹配,apache-spark,join,types,Apache Spark,Join,Types,当连接两个数据帧时,其中一个键是十进制的,另一个是字符串,我会得到重复。Spark似乎正在将十进制转换为字符串,从而生成一个科学的符号表达式,但随后以十进制形式显示了原始结果。我通过直接转换为字符串找到了一个解决方法,但这似乎很危险,因为复制是在没有警告的情况下创建的。 这是虫子吗?我如何检测何时发生这种情况 以下是pyspark在Spark 2.4上的演示: >>从pyspark.sql.functions导入* >>>从pyspark.sql.types导入* >>>df1=spark.cr

当连接两个数据帧时,其中一个键是十进制的,另一个是字符串,我会得到重复。Spark似乎正在将十进制转换为字符串,从而生成一个科学的符号表达式,但随后以十进制形式显示了原始结果。我通过直接转换为字符串找到了一个解决方法,但这似乎很危险,因为复制是在没有警告的情况下创建的。 这是虫子吗?我如何检测何时发生这种情况

以下是pyspark在Spark 2.4上的演示:

>>从pyspark.sql.functions导入*
>>>从pyspark.sql.types导入*
>>>df1=spark.createDataFrame([('a',9223372034559809871),('b',9223372034559809771)],['group','id_int']
>>>df1=df1.withColumn('id',col('id_int').cast(十进制类型(38,0)))
>>>
>>>df1.show()
+-----+-------------------+-------------------+
|组| id|u int | id|
+-----+-------------------+-------------------+
|a | 9223372034559809871 | 9223372034559809871|
|b | 9223372034559809771 | 9223372034559809771|
+-----+-------------------+-------------------+
>>>
>>>df2=spark.createDataFrame([(1,'9223372034559809871'),(2,'9223372034559809771'),['value','id'])
>>>df2.show()
+-----+-------------------+
|值| id|
+-----+-------------------+
|    1|9223372034559809871|
|    2|9223372034559809771|
+-----+-------------------+
>>>
>>>df1.join(df2,[“id”]).show()
+-------------------+-----+-------------------+-----+
|id |组| id | int |值|
+-------------------+-----+-------------------+-----+
|9223372034559809871 | a | 9223372034559809871 | 1|
|9223372034559809871 | a | 9223372034559809871 | 2|
|9223372034559809771 | b | 9223372034559809771 | 1|
|9223372034559809771 | b | 9223372034559809771 | 2|
+-------------------+-----+-------------------+-----+
>>>df1.d类型
[('group','string'),('id_int','bigint'),('id','decimal(38,0))]

发生这种情况是因为连接键中的值(非常大):

我调整了连接条件中的值,它给了我正确的结果:

从pyspark.sql.types导入*
df1=spark.createDataFrame([('a',9223372034559809871),('b',9123372034559809771)],
['group','id_int'])
df1=df1.withColumn('id',col('id_int').cast(十进制类型(38,0)))
df2=spark.createDataFrame([(1,'9223372034559809871'),(2,'9123372034559809771'),
['value','id'])
df1.join(df2,df1[“id”]==df2[“id”],“inner”).show()

我怀疑这是一个bug。要执行连接,spark必须将这两列转换为公共类型,结果是bigint和decimal的字符串。当然,这种无声发生的事实并不十分有趣。