Spark scala Разверните несколько вложенных столбцов xml в разные столбцы при получении данных из таблицы hive в формате паркета [duplicate]

Обычно _functools является нативным компонентом, который обертывает functools.py. Учитывая, что родные модули не поддерживаются в IronPython (на данный момент), соответствующая функциональность реализована в IronPython.Modules.dll (как показано здесь здесь ).

IronPython.Modules.dll, вероятно, то, что вы отсутствуют.

17
задан anthr 19 October 2015 в 17:57
поделиться

1 ответ

То, что вы хотите, невозможно без пользовательского UDF. В Scala вы можете сделать что-то вроде этого:

val data = sc.parallelize(Seq(
    """{"userId": 1, "someString": "example1",
        "varA": [0, 2, 5], "varB": [1, 2, 9]}""",
    """{"userId": 2, "someString": "example2",
        "varA": [1, 20, 5], "varB": [9, null, 6]}"""
))

val df = sqlContext.read.json(data)

df.printSchema
// root
//  |-- someString: string (nullable = true)
//  |-- userId: long (nullable = true)
//  |-- varA: array (nullable = true)
//  |    |-- element: long (containsNull = true)
//  |-- varB: array (nullable = true)
//  |    |-- element: long (containsNull = true)

Теперь мы можем определить zip udf:

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

// +------+----------+----+----+
// |userId|someString|varA|varB|
// +------+----------+----+----+
// |     1|  example1|   0|   1|
// |     1|  example1|   2|   2|
// |     1|  example1|   5|   9|
// |     2|  example2|   1|   9|
// |     2|  example2|  20|null|
// |     2|  example2|   5|   6|
// +------+----------+----+----+

С сырым SQL:

sqlContext.udf.register("zip", (xs: Seq[Long], ys: Seq[Long]) => xs.zip(ys))
df.registerTempTable("df")

sqlContext.sql(
  """SELECT userId, someString, explode(zip(varA, varB)) AS vars FROM df""")
26
ответ дан Anirudh Ramanathan 19 August 2018 в 02:14
поделиться
  • 1
    Может ли это применяться к 3 столбцам, которые имеют последовательность типов? – Amit Kumar 22 February 2017 в 19:06
  • 2
    @AmitKumar Да, почему бы и нет? Вам придется настроить подпись и тело, но это не сложно. – zero323 23 February 2017 в 06:59
  • 3
    Интересно, можно ли в новом API-интерфейсах баз данных просто использовать карту и объединить массивы вместе без создания UDF и будет ли он быстрее / масштабирован / оптимизирован механизмом выполнения катализатора. Я попробую, когда на консоли. – Davos 21 July 2017 в 14:17
  • 4
    @ zero323 не могли бы вы помочь мне написать выше UDF в java для более чем трех столбцов? – Satish Karuturi 30 January 2018 в 09:28
  • 5
Другие вопросы по тегам:

Похожие вопросы: