如何在转换过程中测试数据类型转换

QPS*_*PSK 0 hadoop apache-spark apache-spark-sql pyspark

我们有一个将数据映射到数据帧的脚本(我们使用的是 pyspark)。数据以字符串形式出现,并且对其进行了一些其他有时昂贵的操作,但作为操作的一部分(调用 withColumn),我们对其最终数据类型进行了强制转换。

我需要判断是否发生了截断,但如果发生了截断,我们不想失败。我们只想要一个数字来知道每个翻译列(大约有 300 列)中有多少行失败。

我的第一个想法是让每一列通过一个 UDF 来进行测试,输出将是一个包含值的数组,以及一个关于它是否通过数据类型检查的值。然后我会做2个选择。一个从数组中选择原始值,另一个聚合未命中。但这似乎是一个草率的解决方案。我对 pyspark/hadoop 世界还很陌生……很想知道是否有更好的(也许是标准的?)方法来做到这一点。

hi-*_*zir 5

在最新的 Spark 版本中,Spark 中的数字转换不会失败,也不会导致无提示溢出 - 如果值格式不正确,或者太大而无法被目标类型容纳,则结果未定义 - NULL

因此,您所要做的就是简单的NULL计数使用 Pyspark 计算 Spark 数据帧每一列中非 NaN 条目的数量cast

from pyspark.sql.functions import count

df = spark.createDataFrame(['132312312312312321312312', '123', '32'], 'string')
df_cast = df.withColumn('value_casted' , df['value'].cast('integer'))

df_cast.select((
    # count('value')         - count of NOT NULL values before
    # count('value_casted')  - count of NOT NULL values after
    count('value') - count('value_casted')).alias('value_failed')
).show()
# +------------+
# |value_failed|
# +------------+
# |           1|
# +------------+
Run Code Online (Sandbox Code Playgroud)