gpt4 book ai didi

apache-spark - 如何融化 Spark DataFrame?

转载 作者:行者123 更新时间:2023-12-03 07:53:59 25 4
gpt4 key购买 nike

在 PySpark 或至少在 Scala 中的 Apache Spark 中是否有 Pandas Melt 函数的等价物?

到目前为止,我一直在 python 中运行一个示例数据集,现在我想对整个数据集使用 Spark。

提前致谢。

最佳答案

没有内置函数(如果您使用 SQL 和 Hive 支持,您可以使用 stack function ,但它没有在 Spark 中公开并且没有 native 实现),但是推出自己的功能很简单。所需的进口:

from pyspark.sql.functions import array, col, explode, lit, struct
from pyspark.sql import DataFrame
from typing import Iterable

示例实现:
def melt(
df: DataFrame,
id_vars: Iterable[str], value_vars: Iterable[str],
var_name: str="variable", value_name: str="value") -> DataFrame:
"""Convert :class:`DataFrame` from wide to long format."""

# Create array<struct<variable: str, value: ...>>
_vars_and_vals = array(*(
struct(lit(c).alias(var_name), col(c).alias(value_name))
for c in value_vars))

# Add to the DataFrame and explode
_tmp = df.withColumn("_vars_and_vals", explode(_vars_and_vals))

cols = id_vars + [
col("_vars_and_vals")[x].alias(x) for x in [var_name, value_name]]
return _tmp.select(*cols)

还有一些测试(基于 Pandas doctests ):
import pandas as pd

pdf = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})

pd.melt(pdf, id_vars=['A'], value_vars=['B', 'C'])

   A variable  value
0 a B 1
1 b B 3
2 c B 5
3 a C 2
4 b C 4
5 c C 6

sdf = spark.createDataFrame(pdf)
melt(sdf, id_vars=['A'], value_vars=['B', 'C']).show()

+---+--------+-----+
| A|variable|value|
+---+--------+-----+
| a| B| 1|
| a| C| 2|
| b| B| 3|
| b| C| 4|
| c| B| 5|
| c| C| 6|
+---+--------+-----+

注意:要与旧版 Python 版本一起使用,请删除类型注释。

有关的:
  • r sparkR - equivalent to melt function
  • Gather in sparklyr
  • 关于apache-spark - 如何融化 Spark DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41670103/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com