转换为libsvm时保留Spark Dataframe的顺序

问题描述

我们知道保存到存储器时,Spark Dataframe订单的顺序丢失了 例如,假设我们有一个3列的Spark数据框

+--------+-----+---+
|feature |label| id|
+--------+-----+---+
| ...    | ... |...|
+--------+-----+---+

我们可以使用以下方法将数据框另存为libsvm:

df.select("label","feature").write.mode("overwrite").format("libsvm").save(some_path)

但是,转换为libsvm后,我们丢失了id列。

问题:如何在libsvm中找到数据的id

解决方法

您丢失了id列,因为您选择了列的子集。

如果要插入整个DataFrame,请使用:

df.write.mode("overwrite").format("libsvm").save(some_path)

如果只希望这3列使用:

df.select("label","feature","id").write.mode("overwrite").format("libsvm").save(some_path)

https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/Dataset.html#select(cols:org.apache.spark.sql.Column*):org.apache.spark.sql.DataFrame