функция zip с 3 параметрами - PullRequest
       30

функция zip с 3 параметрами

0 голосов
/ 14 февраля 2019

Я хочу переставить несколько столбцов в таблице Spark SQL
Я нашел это решение только для двух столбцов, я хочу знать, как работать с функцией zip с тремя столбцами varA, varB and varC.

import org.apache.spark.sql.functions.{udf, explode}

val zip = udf((xs: Seq[Long], ys: Seq[Long]) => xs.zip(ys))

df.withColumn("vars", explode(zip($"varA", $"varB"))).select(
   $"userId", $"someString",
   $"vars._1".alias("varA"), $"vars._2".alias("varB")).show

это моя схема данных:

`root
 |-- owningcustomerid: string (nullable = true)
 |-- event_stoptime: string (nullable = true)
 |-- balancename: string (nullable = false)
 |-- chargedvalue: string (nullable = false)
 |-- newbalance: string (nullable = false)
`

я попробовал этот код:

    val zip = udf((xs: Seq[String], ys: Seq[String], zs: Seq[String]) => (xs, ys, zs).zipped.toSeq)

df.printSchema

val df4=df.withColumn("vars", explode(zip($"balancename", $"chargedvalue",$"newbalance"))).select(
   $"owningcustomerid", $"event_stoptime",
   $"vars._1".alias("balancename"), $"vars._2".alias("chargedvalue"),$"vars._2".alias("newbalance"))

я получил эту ошибку:

cannot resolve 'UDF(balancename, chargedvalue, newbalance)' due to data type mismatch: argument 1 requires array<string> type, however, '`balancename`' is of string type. argument 2 requires array<string> type, however, '`chargedvalue`' is of string type. argument 3 requires array<string> type, however, '`newbalance`' is of string type.;;

'Project [owningcustomerid # 1085,event_stoptime # 1086, имя баланса # 1159, начисленное значение # 1160, newbalance # 1161, взрыв

1 Ответ

0 голосов
/ 14 февраля 2019

В Scala вы можете использовать Tuple3.zipped

val zip = udf((xs: Seq[Long], ys: Seq[Long], zs: Seq[Long]) => 
  (xs, ys, zs).zipped.toSeq)

zip($"varA", $"varB", $"varC")

В частности, в Spark SQL (> = 2.4) вы можете использовать функцию arrays_zip:

import org.apache.spark.sql.functions.arrays_zip

arrays_zip($"varA", $"varB", $"varC")

Однако выИмейте в виду, что ваши данные не содержат array<string>, а просто strings - следовательно, Spark arrays_zip или разнесение не допускаются, и вы должны сначала проанализировать свои данные.

...