Я учу себя scala (чтобы использовать его с Apache Spark) и хотел знать, будет ли какой-то способ объединить ряд преобразований в Spark DataFrame. Например. давайте предположим, что у нас есть список преобразований
l: List[(String, String)] = List(("field1", "nonEmpty"), ("field2", "notNull"))
и Spark DataFrame
df
, чтобы желаемый результат был
df.filter(df("field1") =!= "").filter(df("field2").isNotNull)
.
Я думал, что это можно сделать с помощью композиции функций, свертки списка или чего-то еще, но я действительно не знаю, как это сделать. Любая помощь будет принята с благодарностью.
Спасибо!
Да, это вполне возможно. Но это зависит от того, что вы действительно хотите, я имею в виду, что Spark предоставляет Трубопроводы, что позволяет составлять ваши преобразования и создавать конвейер, который можно сериализовать. Вы можете создавать свои собственные трансформеры, например, здесь. Вы можете включить свои «фильтрующие» этапы в пользовательские преобразования, которые вы сможете использовать позже, например, в структурированной потоковой передаче Spark.
Другой вариант — использовать наборы данных Spark и API трансформировать. Это кажется более функциональным и элегантным.
В Scala есть много возможностей для создания собственного API, но сначала взгляните на эти подходы.
Да, вы можете свернуть существующий Dataframe
. Вы можете сохранить все столбцы в списке и не беспокоиться о других промежуточных типах:
val df =
???
val columns =
List(
col("1") =!= "",
col("2").isNotNull,
col("3") > 10
)
val filtered =
columns.foldLeft(df)((df, col) => df.filter(col))
Вау, я не знал ни о искровых конвейерах, ни о Transform API. Большое спасибо за ваш ответ!