如何在转换期间测试数据类型转换

tvz2xvvm  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(296)

我们有一个将数据Map到Dataframe的脚本(我们使用的是pyspark)。数据以字符串的形式输入,有时会对其执行一些其他昂贵的操作,但作为操作(调用withcolumn)的一部分,我们对其最终数据类型执行强制转换。
我有一个要求,告诉如果截断发生,但我们不想失败,如果它确实发生了。我们只需要一个数字来知道每一个已翻译列中有多少行(大约有300列)失败。
我的第一个想法是让每一列都通过一个udf来进行测试,输出将是一个带有值的数组,以及一个关于它是否通过了数据类型检查的值。然后我做两个选择。一个从数组中选择原始值,另一个聚合未命中值。但这似乎是一个草率的解决方案。我对pyspark/hadoop还比较陌生。。。我很想知道是否有更好的(也许是标准的?)方法来做到这一点。

mwkjh3gx

mwkjh3gx1#

在最新的spark版本中,在spark中转换数字不会失败,也不会导致无声溢出-如果值的格式不正确,或者太大而无法由目标类型容纳,则结果是未定义的- NULL .
所以你所要做的就是简单的计算 NULL 值(使用pyspark对sparkDataframe的每列中的非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|

# +------------+

相关问题