Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Python PySPark—用于在操作后确定数据类型的函数_Python_Apache Spark_Pyspark - Fatal编程技术网

Python PySPark—用于在操作后确定数据类型的函数

Python PySPark—用于在操作后确定数据类型的函数,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,在PySpark中使用udf时,我们必须在创建udf时声明操作的返回类型 现在考虑一个场景,我有两个列,我将它们添加到一个第三列中。我使用以下公式将它们相加 >>> udf_add = udf(lambda x: x[0]+x[1], IntegerType()) >>> spark.createDataFrame([(101, 1, 16)], ['ID', 'A', 'B']).withColumn('Result', udf_add(array('A'

在PySpark中使用
udf
时,我们必须在创建
udf
时声明操作的返回类型

现在考虑一个场景,我有两个列,我将它们添加到一个第三列中。我使用以下公式将它们相加

>>> udf_add  = udf(lambda x: x[0]+x[1], IntegerType())
>>> spark.createDataFrame([(101, 1, 16)], ['ID', 'A', 'B']).withColumn('Result', udf_add(array('A', 'B'))).show()
+---+---+---+------+
| ID|  A|  B|Result|
+---+---+---+------+
|101|  1| 16|    17|
+---+---+---+------+
现在假设其中一列是浮点,我执行相同的操作

>>> spark.createDataFrame([(101, 1, 16.1)], ['ID', 'A', 'B']).withColumn('Result', udf_add(array('A', 'B'))).show()

+---+---+----+------+
| ID|  A|   B|Result|
+---+---+----+------+
|101|  1|16.1|  null|
+---+---+----+------+
在本例中,我得到一个null,因为我的结果实际上是一个浮点,但我已经向
udf
提到它将是一个浮点。为了克服这个问题,我将我的
udf
更改为
FloatType
以考虑所有情况

>>> udf_add = udf(lambda x: x[0] + x[1], FloatType())
但当我将整数值传递给它时,它返回
null
value

>>> spark.createDataFrame([(101, 1, 16)], ['ID', 'A', 'B']).withColumn('Result', udf_add(array('A', 'B'))).show()

+---+---+---+------+
| ID|  A|  B|Result|
+---+---+---+------+
|101|  1| 16|  null|
+---+---+---+------+
所以问题是-pyspark中是否有一种数据类型包含整数和浮点,并且可以处理上述两种情况

如果没有,是否有方法确定或不定义数据类型

我问这个的原因是因为我有多个数据集,我想在它们之间执行相同的操作集。这些值可以是整数或浮点数

pyspark中是否有包含整数和浮点的数据类型,并且可以处理上述两种情况

没有。如果希望代码尽可能通用,请将输出转换为可容纳结果的最通用类型:

 udf(lambda x: float(x[0] + x[1]), DoubleType()) 
或者通过强制转换输入列来确保在调用时始终使用正确的类型

 udf(lambda x: x[0] + x[1], DoubleType()) 
 ...
 udf_add(array('A', 'B').cast("array<double>")  
udf(lambda x:x[0]+x[1],DoubleType())
...
自定义项添加(数组('A','B')。强制转换(“数组”)
显然,您永远不会在生产代码中使用
udf
进行简单的添加。只需在
对象上使用
\uu添加
+
)。只有在无法实现更有效的解决方案时,我们才使用
udf

如果没有,是否有方法确定或不定义数据类型

不可以。返回类型必须事先知道,
udf
是一个黑匣子-Spark无法判断应该是什么类型