Python PySPark—用于在操作后确定数据类型的函数
在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'
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无法判断应该是什么类型