Как разобрать url в spark sql (Scala) - PullRequest
0 голосов
/ 27 августа 2018

Я использую следующую функцию для разбора URL, но она выдает ошибку,

val b = Seq(("http://spark.apache.org/path?query=1"),("https://people.apache.org/~pwendell/spark-nightly/spark-master-docs/latest/api/sql/#negative")).toDF("url_col")
        .withColumn("host",parse_url($"url_col","HOST"))
        .withColumn("query",parse_url($"url_col","QUERY"))
        .show(false)

Ошибка:

<console>:285: error: not found: value parse_url
               .withColumn("host",parse_url($"url_col","HOST"))
                                  ^
<console>:286: error: not found: value parse_url
               .withColumn("query",parse_url($"url_col","QUERY"))
                                   ^

Прошу вас, как разбить URL на разные части.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Ответ @Ramesh правильный, но вам также может понадобиться хакерский способ использовать эту функцию без SQL-запросов:)

Хак в том, что функция callUDF вызывает не только UDF, но и любую доступную функцию.

Так что вы можете написать:

import org.apache.spark.sql._
import org.apache.spark.sql.functions._

b.withColumn("host", callUDF("parse_url", $"url_col", lit("HOST"))).
 withColumn("query", callUDF("parse_url", $"url_col", lit("QUERY"))).
 show(false)

Редактировать: после этот запрос на извлечение объединяется, вы можете просто использовать parse_url как обычную функцию. PR сделал после этого вопроса:)

0 голосов
/ 27 августа 2018

Как упоминалось ранее, когда вы регистрируете UDF, вы не получаете функцию Java, скорее вы вводите ее в Spark, поэтому вы должны вызывать ее "Spark-way".

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

val b = Seq(("http://spark.apache.org/path?query=1"),("https://people.apache.org/~pwendell/spark-nightly/spark-master-docs/latest/api/sql/#negative")).toDF("url_col")
val c = b.selectExpr("*", "parse_url(url_col, 'HOST') as host", "parse_url(url_col, 'QUERY') as query")
c.show(false)
0 голосов
/ 27 августа 2018

parse_url доступно только как sql, а не как API . см. parse_url

так что вы должны использовать его как SQL-запрос, а не как вызов функции через API

Вы должны зарегистрировать фрейм данных и использовать запрос , как показано ниже

val b = Seq(("http://spark.apache.org/path?query=1"),("https://people.apache.org/~pwendell/spark-nightly/spark-master-docs/latest/api/sql/#negative")).toDF("url_col")

b.createOrReplaceTempView("temp")
spark.sql("SELECT url_col, parse_url(`url_col`, 'HOST') as HOST, parse_url(`url_col`,'QUERY') as QUERY from temp").show(false)

, который должен дать вам вывод

+--------------------------------------------------------------------------------------------+-----------------+-------+
|url_col                                                                                     |HOST             |QUERY  |
+--------------------------------------------------------------------------------------------+-----------------+-------+
|http://spark.apache.org/path?query=1                                                        |spark.apache.org |query=1|
|https://people.apache.org/~pwendell/spark-nightly/spark-master-docs/latest/api/sql/#negative|people.apache.org|null   |
+--------------------------------------------------------------------------------------------+-----------------+-------+

Надеюсь, ответ полезен

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