Spark SQL, как взорвать строки с таблицами типов иерархии - PullRequest
0 голосов
/ 26 января 2019

Таблица исходных данных

/Company/Engineering/DataTeam 45

/Company/Engineering/Mobile 50

Таблица выходных данных

/Company 45

/Company/Engineering 45

/Company/Engineering/DataTeam 45

/Company 50

/Company/Engineering 50

/Company/Engineering/MobileTeam 50


Так что мой вопрос в основном заключается в том, что, глядя на приведенную выше таблицу исходных и выходных данных, преобразование исходной таблицы в таблицу выходных данных, как я могу добиться этого с помощью spark sql.

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

Любые предложения о том, как я могу добиться этого с помощью spark sql?

1 Ответ

0 голосов
/ 28 января 2019

В UDF вы можете вернуть Seq [String], который может быть разнесен для получения нескольких строк.

Проверьте это:

scala> val df = Seq(("/Company/Engineering/DataTeam",45),("/Company/Engineering/Mobile",50)).toDF("a","b")
df: org.apache.spark.sql.DataFrame = [a: string, b: int]

scala> df.show(false)
+-----------------------------+---+
|a                            |b  |
+-----------------------------+---+
|/Company/Engineering/DataTeam|45 |
|/Company/Engineering/Mobile  |50 |
+-----------------------------+---+

scala> val udf_hier_str = udf( (x:String) => x.split('/').drop(1).scanLeft(""){(acc, next) => acc + "/" + next}.drop(1) )
udf_hier_str: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,ArrayType(StringType,true),Some(List(StringType)))

scala> df.withColumn("gen_hier",explode(udf_hier_str('a))).show(false)
+-----------------------------+---+-----------------------------+
|a                            |b  |gen_hier                     |
+-----------------------------+---+-----------------------------+
|/Company/Engineering/DataTeam|45 |/Company                     |
|/Company/Engineering/DataTeam|45 |/Company/Engineering         |
|/Company/Engineering/DataTeam|45 |/Company/Engineering/DataTeam|
|/Company/Engineering/Mobile  |50 |/Company                     |
|/Company/Engineering/Mobile  |50 |/Company/Engineering         |
|/Company/Engineering/Mobile  |50 |/Company/Engineering/Mobile  |
+-----------------------------+---+-----------------------------+


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