Как показать только соответствующие столбцы из DataFrame Spark? - PullRequest
0 голосов
/ 07 декабря 2018

У меня большой JSON-файл с 432 парами ключ-значение и множеством строк таких данных.Эти данные загружаются довольно хорошо, однако, когда я хочу использовать df.show () для отображения 20 элементов, я вижу кучу нулей.Файл довольно редкий.Очень сложно что-то из этого сделать.Что было бы неплохо - это отбросить столбцы, которые имеют только нулевые значения для 20 строк, однако, учитывая, что у меня много пар ключ-значение, это трудно сделать вручную.Есть ли способ определить в кадре данных Spark, какие столбцы содержат только нули, и отбросить их?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Аналогично идее Сатияна, но с использованием имени столбца в самом count ().

scala>  val df = Seq((1,2,null),(3,4,null),(5,6,null)).toDF("a","b","c")
df: org.apache.spark.sql.DataFrame = [a: int, b: int ... 1 more field]

scala> df.show
+---+---+----+
|  a|  b|   c|
+---+---+----+
|  1|  2|null|
|  3|  4|null|
|  5|  6|null|
+---+---+----+


scala> val notnull_cols = df.select(df.columns.map(x=>concat_ws("=",first(lit(x)),count(col(x)))):_*).first.toSeq.map(_.toString).filter(!_.contains("=0")).map( x=>col(x.split("=")(0)) )
notnull_cols: Seq[org.apache.spark.sql.Column] = ArrayBuffer(a, b)

scala> df.select(notnull_cols:_*).show
+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  3|  4|
|  5|  6|
+---+---+

Промежуточные результаты показывают счет вместе с именами столбцов

scala> df.select(df.columns.map(x=>concat_ws("=",first(lit(x)),count(col(x))).as(x+"_nullcount")):_*).show
+-----------+-----------+-----------+
|a_nullcount|b_nullcount|c_nullcount|
+-----------+-----------+-----------+
|        a=3|        b=3|        c=0|
+-----------+---------- -+-----------+


scala>
0 голосов
/ 07 декабря 2018

Вы можете попробовать, как показано ниже, для получения дополнительной информации, Refer_question

scala> val df = Seq((1,2,null),(3,4,null),(5,6,null),(7,8,"9")).toDF("a","b","c")

scala> df.show
+---+---+----+
|  a|  b|   c|
+---+---+----+
|  1|  2|null|
|  3|  4|null|
|  5|  6|null|
|  7|  8|   9|
+---+---+----+

scala> val dfl = df.limit(3) //limiting the number of rows you need, in your case it is 20

scala> val col_names = dfl.select(dfl.columns.map(x => count(col(x)).alias(x)):_*).first.toSeq.zipWithIndex.filter(x => x._1.toString.toInt > 0).map(_._2).map(x => dfl.columns(x)).map(x => col(x)) // this will give you column names which is having not null values
col_names: Seq[org.apache.spark.sql.Column] = ArrayBuffer(a, b)

scala> dfl.select(col_names : _*).show
+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  3|  4|
|  5|  6|
+---+---+

Дайте мне знать, если это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...