合并Scala Spark sql架构

时间:2017-10-05 01:30:07

标签: sql scala apache-spark

我正在尝试合并两个数据帧并使用包含其他数据帧的新列创建数据帧作为数组。有谁知道如何在scala中实现它?

//架构1

PRIM_KEY: decimal(20,0) (nullable = true)
|-- SOME_DECIMAL: decimal(20,0) (nullable = true)
|-- SOME_INTEGER: integer (nullable = true)

//架构2

PRIM_KEY: decimal(20,0) (nullable = true)
|-- COLUMN1: string (nullable = false)
|-- COLUMN2: string (nullable = false)

//结果架构

RIM_KEY: decimal(20,0) (nullable = true)
|-- SOME_DECIMAL: decimal(20,0) (nullable = true)
|-- SOME_INTEGER: integer (nullable = true)
|-- an_array: array (nullable = true)
|    |-- element: String (containsNull = false)

2 个答案:

答案 0 :(得分:0)

一种方法是创建一个UDF,将两个列表合并为一个,对已连接的数据框执行groupBy,然后应用UDF,如下所示:

val df1 = Seq(
  (1, 100.1, 10),
  (2, 200.2, 20)
).toDF("pk", "col1", "col2")

val df2 = Seq(
  (1, "a1", "b1"),
  (1, "c1", "d1"),
  (2, "a2", "b2")
).toDF("pk", "str_col1", "str_col2")

def combineLists = udf(
  (a: Seq[String], b: Seq[String]) => a ++ b
)

val df3 = df1.join(df2, Seq("pk")).
  groupBy(df1("pk"), df1("col1"), df1("col2")).agg(
    combineLists(collect_list(df2("str_col1")), collect_list(df2("str_col2"))).alias("arr_col")
  ).
  select(df1("pk"), df1("col1"), df1("col2"), col("arr_col"))

df3.show
+---+-----+----+----------------+
| pk| col1|col2|         arr_col|
+---+-----+----+----------------+
|  1|100.1|  10|[c1, a1, d1, b1]|
|  2|200.2|  20|        [a2, b2]|
+---+-----+----+----------------+

答案 1 :(得分:0)

您正在寻找的结果:

RIM_KEY: decimal(20,0) (nullable = true)
|-- SOME_DECIMAL: decimal(20,0) (nullable = true)
|-- SOME_INTEGER: integer (nullable = true)
|-- an_array: array (nullable = true)
|    |-- element: String (containsNull = false)

让我先告诉你

array(nullable = true)不是数据类型,而是数据结构。 因此,您根本无法将架构定义为DataType Array。

一种方法是使用concat_ws与字符串连接,并对第二个数据集执行withcolumn操作。

E.G:

val tmpDf = test2Df.select(concat_ws(",", col("NAME"), col("CLASS")).as("ARRAY_COLUMN"))
val mergedDf = test1Df.withColumn("ARRAY_COLUMN",tmpDf.col("ARRAY_COLUMN"))

我不明白您将数组类型用作架构的用例是什么,但是您可以使用级联结果并将其转换为数组。

希望这对您有所帮助,我知道在这里回答得有点晚,但是即使现在它仍然对您有帮助,我仍然很高兴。