Фильтрация неразорвавшейся структуры в SPARK Data Frame с помощью Scala - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть:

 +-----------------------+-------+------------------------------------+
 |cities                 |name   |schools                             |
 +-----------------------+-------+------------------------------------+
 |[palo alto, menlo park]|Michael|[[stanford, 2010], [berkeley, 2012]]|
 |[santa cruz]           |Andy   |[[ucsb, 2011]]                      |
 |[portland]             |Justin |[[berkeley, 2014]]                  |
 +-----------------------+-------+------------------------------------+

Я не потею:

 val res = df.select ("*").where (array_contains (df("schools.sname"), "berkeley")).show(false)

Но без желания взорваться или использовать UDF, я так же или аналогично, как указано выше,Как я могу сделать что-то вроде:

 return all rows where at least 1 schools.sname starts with "b"  ?

Например:

 val res = df.select ("*").where (startsWith (df("schools.sname"), "b")).show(false)

Это, конечно, неправильно, просто чтобы продемонстрировать точку.Но как я могу сделать что-то подобное без взрыва или использования UDF, возвращающего true / false или чего-либо еще и фильтрации вообще без использования UDF?Может быть, это невозможно.Я не могу найти таких примеров.Или это expr Мне нужно?

Получены ответы, которые показывают, как определенные вещи имеют определенный подход, поскольку некоторые возможности не существуют в SCALA.Я прочитал статью, в которой говорится о новых возможностях массива, которые будут реализованы после этого, и это доказывает правильность.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Как насчет этого.

scala> val df = Seq ( ( Array("palo alto", "menlo park"), "Michael", Array(("stanford", 2010), ("berkeley", 2012))),
     |     (Array(("santa cruz")),"Andy",Array(("ucsb", 2011))),
     |       (Array(("portland")),"Justin",Array(("berkeley", 2014)))
     |     ).toDF("cities","name","schools")
df: org.apache.spark.sql.DataFrame = [cities: array<string>, name: string ... 1 more field]

scala> val df2 = df.select ("*").withColumn("sch1",df("schools._1"))
df2: org.apache.spark.sql.DataFrame = [cities: array<string>, name: string ... 2 more fields]

scala> val df3=df2.select("*").withColumn("sch2",concat_ws(",",df2("sch1")))
df3: org.apache.spark.sql.DataFrame = [cities: array<string>, name: string ... 3 more fields]

scala> df3.select("*").where( df3("sch2") rlike "^b|,b" ).show(false)
+-----------------------+-------+------------------------------------+--------------------+-----------------+
|cities                 |name   |schools                             |sch1                |sch2             |
+-----------------------+-------+------------------------------------+--------------------+-----------------+
|[palo alto, menlo park]|Michael|[[stanford, 2010], [berkeley, 2012]]|[stanford, berkeley]|stanford,berkeley|
|[portland]             |Justin |[[berkeley, 2014]]                  |[berkeley]          |berkeley         |
+-----------------------+-------+------------------------------------+--------------------+-----------------+

еще один шаг, вы можете удалить ненужные столбцы.

0 голосов
/ 27 сентября 2018

Я не уверен, квалифицируется ли это как UDF или нет, но вы можете определить новую функцию фильтра.Если вы используете Dataset[Student] где:

case class School(sname: String, year: Int)
case class Student(cities: Seq[String], name: String, schools: Seq[School])

Тогда вы можете просто сделать следующее:

students
    .filter(
        r => r.schools.filter(_.sname.startsWith("b")).size > 0)

Однако, если вы просто используете DataFrame, тогда:

import org.apache.spark.sql.Row

students.toDF
    .filter(
        r => r.getAs[Seq[Row]]("schools").filter(_.getAs[String]("name")
                                         .startsWith("b")).size > 0)

И то и другое:

+-----------------------+-------+------------------------------------+
|cities                 |name   |schools                             |
+-----------------------+-------+------------------------------------+
|[palo alto, menlo park]|Michael|[[stanford, 2010], [berkeley, 2012]]|
|[portland]             |Justin |[[berkeley, 2014]]                  |
+-----------------------+-------+------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...