【问题标题】:Spark dataframe withColumn on partitions分区上带有列的 Spark 数据框
【发布时间】:2018-07-15 14:18:21
【问题描述】:

数据框中的“colA”列包含整数值:

+-----+
| colA|
+-----+
|    1|
|    2|
|    1|
|    3|
+-----+

这些整数值可以通过 Redis 字典映射到字符串:

+----+------+
| key| value|
+----+------+
|   1|     a|
|   2|     b|
|   3|     c|
+----+------+

我需要创建一个新列“colB”,其中包含“colA”到字符串值的映射:

+-----+-----+
| colA| colB|
+-----+-----+
|    1|    a|
|    2|    b|
|    1|    a|
|    3|    c|
+-----+-----+

我的目标是向 Redis 发出批量请求,以避免每行单个 Redis 请求的延迟。

在 Spark Core API(即 RDD)中,我可以通过使用 mapPartitions 函数来做到这一点。有没有什么方法可以通过使用 Spark SQL API 来实现?

请注意,我想避免以下开销:

  • 将数据帧转换为 RDD,反之亦然。
  • 通过直接在 数据框。

【问题讨论】:

  • 还有带有数据框的mapPartition函数。

标签: scala apache-spark dataframe apache-spark-sql


【解决方案1】:

请注意,我想避免以下开销:

  • ...
  • 通过直接在数据帧上调用 mapPartitions 来关联编码器。

这实际上是不可能的。任何不使用 SQL DSL 的操作都需要解码为外部类型并编码回内部类型。使用原始值,如果使用二进制编码器,它是低成本操作,但它仍然需要Encoder

【讨论】:

  • 谢谢。我会把这个作为正确答案。能否请您参考使用二进制编码器的示例?
  • "Binary" Encoders 用于任何时候返回 Product 类型,例如元组 (Int, String, Long)。它与RowEncoder 相反,当您返回Row 时必须使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多