Извлеките значение столбца массива искрового информационного кадра и используйте его как имя столбца в пользовательской функции - PullRequest
2 голосов
/ 08 ноября 2019

Я пытаюсь получить имя столбца из одного столбца и передать его в качестве параметра в udf. напримерУ меня есть DataFrame:

 | name   | array_column       | column4 | column5 |
 |--------|--------------------|---------|---------|
 | first  | column4,column5    |   V1    |    V2   |
 | test   | column4,column5    |   V1    |    V2   |
 | choose | column3,column5    |   V1    |    V2   |

df.withcolumn("test",udf(array_column(0),arraycolumn(1)))

, где array_column(0) и array_column(1), которые column4 и column5, соответственно, представляют 2 имени столбца в кадре данных.

Я хочу в основномсделать udf (column4, column5), но мне нужно получить значения array_column и передать их в качестве параметра моего udf

Я попытался установить его, но по какой-то причине столбец не вызывается должным образом. Он называется String вместо элементов массива

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете попробовать этот код:

Начните с создания 2 классов дел для управления вашими фреймами данных:

case class ResultArray(metric1: Double, metric2: Double, metric3: Double, metric4: Double, metricName: String, opportunityMetricsCol: Array[String])

case class ExpectedResult(value: String)

Затем вы можете извлечь ожидаемые столбцы следующим образом:

val resultArray = Seq(ResultArray(0.55, 0.66012, 164.8204, 4.5,"MetricCalc1", Array("metric1","metric2")),
      ResultArray(0.55, 0.66012, 164.8204, 4.5,"MetricCalc1", Array("metric3","metric4")))

+-------+-------+--------+-------+-----------+---------------------+
|metric1|metric2|metric3 |metric4|metricName |opportunityMetricsCol|
+-------+-------+--------+-------+-----------+---------------------+
|0.55   |0.66012|164.8204|4.5    |MetricCalc1|[metric1, metric2]   |
|0.55   |0.66012|164.8204|4.5    |MetricCalc1|[metric3, metric4]   |
+-------+-------+--------+-------+-----------+---------------------+

    val resultArrayDF = resultArray.toDF

    val expectedResult: Dataset[ExpectedResult] = resultArrayDF.map{ value =>
      val opportunityMetricsCol: util.List[String] = value.getList(5)

      ExpectedResult(opportunityMetricsCol.get(0))

    }

    resultArrayDF.select(expectedResult.first().value).show(false)

    expectedResult.show(false)

+-------+
|metric1|
+-------+
|0.55   |
|0.55   |
+-------+

Надеюсь, это поможет

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