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

时间:2018-05-23 20:28:55

标签: apache-spark hadoop pyspark apache-spark-sql

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

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

我的第一个想法是让每个列都通过一个UDF来进行测试,输出将是一个带有值的数组,以及一个值是否通过数据类型检查。然后我做2个选择。一个选择数组中的原始值,另一个聚合未命中。但这似乎是一个草率的解决方案。我是pyspark / hadoop世界的新手......很想知道是否有更好的(可能是标准的)方式来做这件事。

1 个答案:

答案 0 :(得分:3)

在最新的Spark版本中,Spark中的转换数字不会失败,并且不会导致静默溢出 - 如果值格式不正确,或者目标类型要适应大,那么结果未定义 - NULL

所以你需要做的就是在NULL之后简单计算cast值(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|
# +------------+