[英]How to convert DataFrame to Dataset in Apache Spark in Java?
[英]How to transpose an Apache Spark Dataset in Java
我有一個要轉換的Apache Spark Dataset<Row>
。 從這里的一些主題中,我很清楚可以通過分組-透視-聚合來完成此操作。 但是我並沒有按照我需要的方式得到它。 我有以下輸入表:
+-------+------+------+------+------+
| 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));
}
但它確實很慢,並且不打算以這種方式實施。 您有什么建議嗎? 提前致謝!
不幸的是,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|
+-----+------+---+-----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.