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

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

我们有一个将数据映射到数据框的脚本(我们使用的是 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/

相关文章:

hadoop - HDFS、HBase、Pig、Hive 和 Azkaban 之间的关系?

python - Python 3 中 Pyspark 的 takeOrdered 键错误

apache-spark - 在 for 循环内将映射函数附加到 PySpark RDD

apache-spark - 自定义源/接收器配置无法识别

maven - Apache zeppelin 在 zeppelin-web 中使用 Bower 构建过程失败

apache-spark - Pyspark ML - 如何保存管道和 RandomForestClassificationModel

pyspark - Spark Dataframe 分组和分区键具有一定数量的分区。

apache-spark - 从 pyspark 数据框中的结构类型获取字段值

hadoop - 使用超过15位数字的数值变量将sas数据写入Hive

hadoop - pig : Splitting large large file into multiple smaller files