как выбрать столбцы из другого кадра данных, где эти столбцы являются списком значений столбца в другом кадре данных - PullRequest
0 голосов
/ 24 марта 2020

Я использую spark- sql 2.3.1v с java8. У меня есть фрейм данных, как показано ниже

 val df_data = Seq(
  ("G1","I1","col1_r1", "col2_r1","col3_r1"),
  ("G1","I2","col1_r2", "col2_r2","col3_r3")
 ).toDF("group","industry_id","col1","col2","col3")
.withColumn("group", $"group".cast(StringType))
.withColumn("industry_id", $"industry_id".cast(StringType))
.withColumn("col1", $"col1".cast(StringType))
.withColumn("col2", $"col2".cast(StringType))
.withColumn("col3", $"col3".cast(StringType))

+-----+-----------+-------+-------+-------+
|group|industry_id|   col1|   col2|   col3|
+-----+-----------+-------+-------+-------+
|   G1|         I1|col1_r1|col2_r1|col3_r1|
|   G1|         I2|col1_r2|col2_r2|col3_r3|
+-----+-----------+-------+-------+-------+


val df_cols = Seq(
  ("1", "usa", Seq("col1","col2","col3")),
  ("2", "ind", Seq("col1","col2"))
 ).toDF("id","name","list_of_colums")
.withColumn("id", $"id".cast(IntegerType))
.withColumn("name", $"name".cast(StringType))


+---+----+------------------+
| id|name|    list_of_colums|
+---+----+------------------+
|  1| usa|[col1, col2, col3]|
|  2| ind|      [col1, col2]|
+---+----+------------------+

Вопрос: Как показано выше, у меня есть информация о столбцах в фрейме данных "df_cols". И все данные в кадре данных "df_data". Как я могу выбрать столбцы динамически от "df_data" для данного идентификатора "df_cols" ??

1 Ответ

1 голос
/ 24 марта 2020

Начальный вопрос:

val columns = df_cols
  .where("id = 2")
  .select("list_of_colums")
  .rdd.map(r => r(0).asInstanceOf[Seq[String]]).collect()(0)

val df_data_result = df_data.select(columns(0), columns.tail: _*)

+-------+-------+
|   col1|   col2|
+-------+-------+
|col1_r1|col2_r1|
|col1_r2|col2_r2|
+-------+-------+

Обновленный вопрос:

1) Мы можем просто использовать 2 списка: stati c колонки + динамические c единицы

2) Я думаю, что «rdd» в этом коде нормально. К сожалению, я не знаю, как обновиться до "Dataframe".

val staticColumns = Seq[String]("group", "industry_id")
val dynamicColumns = df_cols
  .where("id = 2")
  .select("list_of_colums")
  .rdd.map(r => r(0).asInstanceOf[Seq[String]]).collect()(0)

val columns: Seq[String] = staticColumns ++ dynamicColumns
val df_data_result = df_data.select(columns(0), columns.tail: _*)

+-----+-----------+-------+-------+
|group|industry_id|   col1|   col2|
+-----+-----------+-------+-------+
|   G1|         I1|col1_r1|col2_r1|
|   G1|         I2|col1_r2|col2_r2|
+-----+-----------+-------+-------+
...