Есть несколько способов подойти к этому. На высоком уровне, может быть, что-то вроде этого:
- Загрузить таблицу кустов в DataFrame
- Из кадра данных получите столбцы
df.schema.fields
- Для каждого поля создайте новый фрейм данных со всеми новыми столбцами (вам придется переписать ваш запрос улья в spark sql)
Редактировать: Вот быстрый старт, который я бросил вместе. Извините, у меня нет больше времени, чтобы это уточнить, но, надеюсь, это иллюстрирует то, что я думал.
val schema = sql.types.StructType(List(
sql.types.StructField("lions", sql.types.IntegerType, nullable = false),
sql.types.StructField("tigers", sql.types.IntegerType, nullable = false),
sql.types.StructField("bears", sql.types.IntegerType, nullable = false)
))
val rows = Seq(
sql.Row(15,10,20),
sql.Row(20,20,30),
sql.Row(35,30,40),
sql.Row(40,40,50),
sql.Row(50,50,60)
)
val rdd = spark.sparkContext.parallelize(rows)
val df = spark.createDataFrame(rdd, schema)
df.createOrReplaceTempView("tbl")
val percentileDfs = df.schema.fields.map(field => {
spark.sql(s"select percentile(${field.name}, array(0.25, 0.5, 0.75, 1)) as ${field.name}_centiles from tbl")
})
percentileDfs.foreach(_.show())
Выход:
+--------------------+
| lions_centiles|
+--------------------+
|[20.0, 35.0, 40.0...|
+--------------------+
+--------------------+
| tigers_centiles|
+--------------------+
|[20.0, 30.0, 40.0...|
+--------------------+
+--------------------+
| bears_centiles|
+--------------------+
|[30.0, 40.0, 50.0...|
+--------------------+
Видите, как я перебираю поля на df.schema
? Тогда вы, вероятно, просто соберете выходные данные из каждого запроса, а затем будете использовать его для генерации новых столбцов (посмотрите спарк withColumn
).