对于非数字列,是否有类似于describe()
的函数?
我想收集有关表格"数据完整性"的统计信息。例如
- 记录总数
- 空值总数
- 特殊值的总数(例如 0、空字符串等)
- 非重复值的总数
- 其他类似的东西...
data.describe() 仅为数字列生成有趣的值(count、mean、stddev、min、max)。有什么东西可以很好地与字符串或其他类型的一起使用吗?
。问题在于,数值数据的基本统计很便宜。在分类数据上,其中一些可能需要多次数据扫描和无限(记录数呈线性)内存。
有些非常便宜。例如,计算 NULL 或空:使用 Pyspark
下面是获取相关字符串列统计信息的示例:
def getStringColumnProfile(df: DataFrame, columnName: String): DataFrame = {
df.select(columnName)
.withColumn("isEmpty", when(col(columnName) === "", true).otherwise(null))
.withColumn("isNull", when(col(columnName).isNull, true).otherwise(null))
.withColumn("fieldLen", length(col(columnName)))
.agg(
max(col("fieldLen")).as("max_length"),
countDistinct(columnName).as("unique"),
count("isEmpty").as("is_empty"),
count("isNull").as("is_null")
)
.withColumn("col_name", lit(columnName))
}
def profileStringColumns(df: DataFrame): DataFrame = {
df.columns.filter(df.schema(_).dataType == StringType)
.map(getStringColumnProfile(df, _))
.reduce(_ union _)
.toDF
.select("col_name"
, "unique"
, "is_empty"
, "is_null"
, "max_length")
}
对于数字列也是如此
def getNumericColumnProfile(df: DataFrame, columnName: String): DataFrame = {
df.select(columnName)
.withColumn("isZero", when(col(columnName) === 0, true).otherwise(null))
.withColumn("isNull", when(col(columnName).isNull, true).otherwise(null))
.agg(
max(col(columnName)).as("max"),
count("isZero").as("is_zero"),
count("isNull").as("is_null"),
min(col(columnName)).as("min"),
avg(col(columnName)).as("avg"),
stddev(col(columnName)).as("std_dev")
)
.withColumn("col_name", lit(columnName))
}
def profileNumericColumns(df: DataFrame): DataFrame = {
df.columns.filter(
Set("DecimalType", "IntegerType", "LongType", "DoubleType", "FloatType", "ShortType")
contains df.schema(_).dataType.toString
)
.map(getNumericColumnProfile(df, _))
.reduce(_ union _)
.toDF
.select("col_name",
"col_type",
"is_null",
"is_zero",
"min",
"max",
"avg",
"std_dev")
}
下面是一些代码来帮助解决分析非数字数据的问题。 请看:
https://github.com/jasonsatran/spark-meta/
为了提高性能,我们可以对数据进行采样或仅选择要显式分析的列。