簡體   English   中英

合並 Scala Spark sql 模式

[英]Merging Scala Spark sql schemas

我正在嘗試合並兩個數據幀並創建一個數據幀,其中包含一個包含另一個數據幀作為數組的新列。 有誰知道這如何在 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)

一種方法是創建一個UDF ,結合兩個列表成為一個,執行一個groupBy上加入dataframes,並應用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]|
+---+-----+----+----------------+

您正在尋求的結果:

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)

我先告訴你:

數組 (nullable = true) 不是數據類型,而是數據結構。 因此,您根本無法將架構定義為 DataType 數組。

一種方法是使用 concat_ws 連接字符串並對第二個數據集執行 withcolumn 操作。

EG:

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

我不明白使用數組類型作為架構的用例是什么,但您可以使用連接結果並轉換為數組。

希望這對你有幫助,我知道在這里回答有點晚了,但如果它現在對你有幫助,我仍然會很高興。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM