我们有一个将数据映射到数据框的脚本(我们使用的是 pyspark)。数据以字符串形式传入,并且对它进行了一些其他有时代价高昂的操作,但作为操作的一部分(调用 withColumn),我们对其最终数据类型进行了强制转换。
我需要判断是否发生了截断,但我们不想在截断发生时失败。我们只想要一个数字来知道每个翻译列(大约有 300 列)中有多少行失败。
我的第一个想法是让每一列通过一个 UDF 来进行测试,输出将是一个包含值的数组,以及一个关于它是否通过数据类型检查的值。然后我会做2个选择。一个从数组中选择原始值,另一个聚合未命中的值。但这似乎是一个草率的解决方案。我是 pyspark/hadoop 世界的新手...很想知道是否有更好的(也许是标准的?)方法来做到这一点。
最佳答案
在最新的 Spark 版本中,在 Spark 中转换数字不会失败,也不会导致静默溢出——如果值的格式不正确,或者太大而无法被目标类型容纳,结果是未定义的——NULL
。
因此,您所要做的就是在 cast
之后对 NULL
值 ( Count number of non-NaN entries in each column of Spark dataframe with Pyspark ) 进行简单计数:
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|
# +------------+
关于apache-spark - 如何在转换期间测试数据类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50496975/