想在spark scala中转置列吗

ee7vknir  于 2021-05-22  发布在  Spark
关注(0)|答案(1)|浏览(366)

我需要使用scala对表执行一些健全性检查。
我的样本表是:

可以使用以下代码生成:

val df = Seq(
    (1, "", "13-05-2020", Some("CSE")),
    (2, "PQR", "14022019", None),
    (3, "XYZ", "25-01-2018", Some(""))
).toDF("ID", "NAME", "Joining Date", "Branch")

现在,我想对所有列执行空检查和日期检查。我希望输出像:

我能够生成这样的Dataframe:

请帮我把数据填入这个数据框。

afdcj2ne

afdcj2ne1#

据我所知,您需要对Dataframe的所有列计算一些通用测试。
你似乎认为这是一个空字符串 "" 就像一个空值。因此,我将首先用null值替换空字符串(仅适用于string类型的列)。

import org.apache.spark.sql.types.StringType
val df_with_nulls = df.select(df.schema.fields.map(c =>
         if(c.dataType == StringType)
             when(col(c.name) === "", null).otherwise(col(c.name)) as c.name
         else
             col(c.name)
) : _*)

然后,为了代码更清晰,我将为每个要执行的检查定义一个函数。如果它们不是您想要的,请随意调整它们:

val name = (c : String) => lit(c) as s"col_list"
val null_check =
    (c : String) => sum(col(c).isNull.cast("int")) > 0 as s"Null_check"
val date_pattern = "[0-9]{2}-?[0-9]{2}-?[0-9]{4}"
val date_check =
    (c : String) => sum(col(c) rlike date_pattern cast "int") > 0 as s"Date_Check"
val distinct_values = (c : String) => collect_set(col(c)) as "Distinct_Values"

最后,您可以将它们以通用方式应用于所有列,如下所示:

df_with_nulls
    .select(array(df.columns.map(c =>
            struct(name(c), date_check(c), null_check(c), distinct_values(c))
    ) : _*) as "a")
    .select(explode('a) as "s")
    .select("s.*")
    .show(false)

同时产生你所期望的:

+------------+----------+----------+----------------------------------+
|col_list    |Date_Check|Null_check|Distinct_Values                   |
+------------+----------+----------+----------------------------------+
|ID          |false     |false     |[1, 2, 3]                         |
|NAME        |false     |true      |[PQR, XYZ]                        |
|Joining Date|true      |false     |[14022019, 13-05-2020, 25-01-2018]|
|Branch      |false     |true      |[CSE]                             |
+------------+----------+----------+----------------------------------+

我唯一的警告是不要在具有太多不同值的列上使用它。事实上,由于它们都聚合到一行中,这将非常缓慢或更糟,从而导致oom异常。

相关问题