根据行值火花选择列

时间:2020-08-28 05:07:37

标签: scala dataframe apache-spark apache-spark-sql

我有一个全字符串spark数据框,我需要返回所有行均符合特定条件的列。

scala> val df = spark.read.format("csv").option("delimiter",",").option("header", "true").option("inferSchema", "true").load("file:///home/animals.csv")

df.show()
+--------+---------+--------+
|Column 1| Column 2|Column 3|
+--------+---------+--------+
|(ani)mal|   donkey|    wolf|
|  mammal|(mam)-mal|  animal|
| chi-mps|   chimps|    goat|
+--------+---------+--------+

在这里,准则是返回列,其中所有行值均具有length==6,而与特殊字符无关。由于第1列和第2列中的所有行都有length==6

,因此响应应在数据框下方
+--------+---------+
|Column 1| Column 2|
+--------+---------+
|(ani)mal|   donkey|
|  mammal|(mam)-mal|
| chi-mps|   chimps|
+--------+---------+

1 个答案:

答案 0 :(得分:1)

如果知道特殊字符,则可以使用regexp_replace删除特殊字符,然后获取长度,过滤以输入所需的字符。

val cols = df.columns
val df2 = cols.foldLeft(df) {
    (df, c) => df.withColumn(c + "_len", length(regexp_replace(col(c), "[()-]", "")))
}

df2.show()

+--------+---------+-------+-----------+-----------+-----------+
| Column1|  Column2|Column3|Column1_len|Column2_len|Column3_len|
+--------+---------+-------+-----------+-----------+-----------+
|(ani)mal|   donkey|   wolf|          6|          6|          4|
|  mammal|(mam)-mal| animal|          6|          6|          6|
| chi-mps|   chimps|   goat|          6|          6|          4|
+--------+---------+-------+-----------+-----------+-----------+