scala - Spark 列因式分解

标签 scala apache-spark apache-spark-sql

是否可以分解 Spark 数据帧列?对于因式分解,我的意思是创建列中每个唯一值到同一 ID 的映射。

示例,原始数据框:

+----------+----------------+--------------------+
|      col1|            col2|                col3|
+----------+----------------+--------------------+
|1473490929|4060600988513370|                   A|
|1473492972|4060600988513370|                   A|
|1473509764|4060600988513370|                   B|
|1473513432|4060600988513370|                   C|
|1473513432|4060600988513370|                   A|
+----------+----------------+--------------------+

分解版本:

+----------+----------------+--------------------+
|      col1|            col2|                col3|
+----------+----------------+--------------------+
|1473490929|4060600988513370|                   0|
|1473492972|4060600988513370|                   0|
|1473509764|4060600988513370|                   1|
|1473513432|4060600988513370|                   2|
|1473513432|4060600988513370|                   0|
+----------+----------------+--------------------+

在 scala 本身中,这将相当简单,但由于 Spark 将其数据帧分布在节点上,我不确定如何保持从 A->0、B->1、C->2 的映射.

此外,假设数据帧非常大(千兆字节),这意味着将一整列加载到一台机器的内存中可能是不可能的。

可以吗?

最佳答案

您可以使用StringIndexer将字母编码为索引:

import org.apache.spark.ml.feature.StringIndexer

val indexer = new StringIndexer()
  .setInputCol("col3")
  .setOutputCol("col3Index")

val indexed = indexer.fit(df).transform(df)
indexed.show()

+----------+----------------+----+---------+
|      col1|            col2|col3|col3Index|
+----------+----------------+----+---------+
|1473490929|4060600988513370|   A|      0.0|
|1473492972|4060600988513370|   A|      0.0|
|1473509764|4060600988513370|   B|      1.0|
|1473513432|4060600988513370|   C|      2.0|
|1473513432|4060600988513370|   A|      0.0|
+----------+----------------+----+---------+

数据:

val df = spark.createDataFrame(Seq(
              (1473490929, "4060600988513370", "A"),
              (1473492972, "4060600988513370", "A"),  
              (1473509764, "4060600988513370", "B"),
              (1473513432, "4060600988513370", "C"),
              (1473513432, "4060600988513370", "A"))).toDF("col1", "col2", "col3")

关于scala - Spark 列因式分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39743028/

相关文章:

regex - 如何匹配每个 A 和 B 但不匹配某个子字符串

scala - 如何在 spark 3.0 结构化流媒体中使用 kafka.group.id 和检查点以继续从 Kafka 中读取它在重启后停止的位置?

python-2.7 - Pyspark 合并数据框中的 WrappedArrays

apache-spark - 如何检查spark数据框是否为空?

scala - 检查 Scala 中涉及存在性的类型的相等性

scala - 参数化选项类型

hadoop - 当映射器输出大部分排序时最小化随机播放

apache-spark - 笔记本作为生产休息 API

apache-spark - DataFrame 分区到单个 Parquet 文件(每个分区)

scala - Spark scala 中columnSimilarties()之后获取列名