亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Java 中轉置 Apache Spark 數據集

如何在 Java 中轉置 Apache Spark 數據集

烙印99 2023-01-05 15:27:14
我有一個Dataset<Row>要轉置的 Apache Spark。從這里的一些主題中,我很清楚這可以通過分組-透視-聚合來完成。但是我沒有按照我需要的方式得到它。我有以下輸入表:+-------+------+------+------+------+| rho_0 | rho_1| rho_2|rho_3 | names|+-------+------+------+------+------+|  1    | 0.89 | 0.66 | 0.074|  rho ||  1    | 0.89 | 0.66 | 0.074|absRho||  0    |  1   | 2    |  3   | lag  |+-------+------+------+------+------+我需要的是+-------+------+------+| rho   |absRho| lag  |+-------+------+------+|  1    | 1    |  0   ||  0.89 | 0.89 |  1   ||  0.66 | 0.66 |  2   ||  0.074| 0.074|  3   |+-------+------+------+我試過類似的東西Dataset<Row> transposed = coll.groupBy().pivot("names").min("rho_0");但這不起作用。從輸入中調用groupBy一系列列也不起作用。我找到了一個我不喜歡的解決方法:Dataset<Row> transposed = coll.groupBy().pivot("names").min("rho_0")for (int i = 1; i < nlags; i++) {    transposed = transposed.union(coll.groupBy().pivot("names").min("rho_" + i));}但它真的很慢,并不意味著以這種方式實施。你有什么建議嗎?提前致謝!
查看完整描述

1 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

不幸的是,spark 中沒有內置函數可以做到這一點。有一個使用的解決方案pivot,但您需要先“分解”數據框。它應該比基于聯合的解決方案快得多。


在 Scala 中,它會按如下方式進行。我在下面添加了一個 java 版本。


// scala

val cols = df.columns

  .filter(_ != "names")

  .map(n => struct(lit(n) as "c", col(n) as "v"))

val exploded_df = df.select(col("names"), explode(array(cols : _*)))

// java

Column[] cols = Arrays

    .stream(df.columns())

    .filter(x -> ! x.equals("names"))

    .map(n -> struct(lit(n).alias("c"), col(n).alias("v")))

    .toArray(Column[]::new);

Dataset<Row> exploded_df = df.select(col("names"), explode(array(cols)));

exploded_df.show();

+------+-------------+

| names|          col|

+------+-------------+

|   rho|    [rho_0,1]|

|   rho| [rho_1,0.89]|

|   rho| [rho_2,0.66]|

|   rho|[rho_3,0.074]|

|absRho|    [rho_0,1]|

|absRho| [rho_1,0.89]|

|absRho| [rho_2,0.66]|

|absRho|[rho_3,0.074]|

|   lag|    [rho_0,0]|

|   lag|    [rho_1,1]|

|   lag|    [rho_2,2]|

|   lag|    [rho_3,3]|

+------+-------------+

基本上,我構建了一個數組列,其中包含由列名及其值組成的結構。然后,我使用 explode 函數來展平這個數組。從那里,我們可以pivot像往常一樣使用 ;-)


// scala and java

exploded_df

  .groupBy(col("col.c"))

  .pivot("names")

  .agg(first(col("col.v")))

  .orderBy("c")

  .show();

+-----+------+---+-----+

|    c|absRho|lag|  rho|

+-----+------+---+-----+

|rho_0|     1|  0|    1|

|rho_1|  0.89|  1| 0.89|

|rho_2|  0.66|  2| 0.66|

|rho_3| 0.074|  3|0.074|

+-----+------+---+-----+


查看完整回答
反對 回復 2023-01-05
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號