如何融化Spark DataFrame?

2023-11-24

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

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


火花 >= 3.4

在 Spark 3.4 或更高版本中,您可以使用内置melt method

(sdf
    .melt(
        ids=['A'], values=['B', 'C'], 
        variableColumnName="variable", 
        valueColumnName="value")
    .show())
+---+--------+-----+
|  A|variable|value|
+---+--------+-----+
|  a|       B|    1|
|  a|       C|    2|
|  b|       B|    3|
|  b|       C|    4|
|  c|       B|    5|
|  c|       C|    6|
+---+--------+-----+

此方法适用于所有 API,因此可以在 Scala 中使用

sdf.melt(Array($"A"), Array($"B", $"C"), "variable", "value")

or SQL

SELECT * FROM sdf UNPIVOT (val FOR col in (col_1, col_2))

火花3.2(仅限 Python,需要 Pandas 和 pyarrow)

(sdf
    .to_koalas()
    .melt(id_vars=['A'], value_vars=['B', 'C'])
    .to_spark()
    .show())
+---+--------+-----+
|  A|variable|value|
+---+--------+-----+
|  a|       B|    1|
|  a|       C|    2|
|  b|       B|    3|
|  b|       C|    4|
|  c|       B|    5|
|  c|       C|    6|
+---+--------+-----+

火花

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

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 文档测试):

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 版本一起使用,请删除类型注释。

Related:

  • R SparkR - 相当于熔化函数
  • 聚集在星光熠熠
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何融化Spark DataFrame? 的相关文章

随机推荐

  • java.lang.IllegalAccessError:方法“void android.support.v4.content.ContextCompat”。无法访问类“com.google.android.gms.iid.zzd”

    当我将目标 sdk 级别从 23 0 2 更改为 25 0 1 时 我的应用程序在以下行崩溃 我应该怎么做才能避免这次崩溃 请提出更改建议 InstanceID instanceID InstanceID getInstance getCo
  • 如何在 Python 中用零初始化整数 array.array 对象

    具有类似标题的问题是关于 Python 列表或 NumPy 的 这是关于标准 Python 库的 array array 类部分 请参阅https docs python org 2 library array html 我想出的快速方法
  • Mysql:如何获取点后具有超过一定小数位数的每一行

    我有一个包含浮点值的表 table id value 1 19 22 2 32 333 3 1 2332 4 0 22334 5 4 55 我想提取点后包含超过 3 位小数的每一行 我期望的结果是 id value 2 32 333 3 1
  • 使用 jQuery 动态向表添加行和列

    我有以下 JavaScript 代码 function addRowToTable var tbl document getElementById tblSample var lastRow tbl rows length if there
  • Delphi - Windows Aero 资源

    有人有关于 7 或 Vista 上的 Delphi 和 Windows Aero 的好资源吗 我们即将将 Windows 7 添加到我们的公司 并希望确保我们的内部应用程序尽可能适应 使用 Delphi 2010 我可以添加玻璃框架 菜单栏
  • 如何在雪豹上安装 iPython

    iPython 可以在 Mac OS X 10 6 1 Snow Leopard 上运行吗 我是 python 菜鸟 如何在 Mac 上安装 iPython 链接 建议 Thanks 要在 10 6 中使用 Apple 提供的 Python
  • 加载和显示大文本文件

    在 Swing 应用程序中 我有时需要支持对加载缓慢的大型 面向行的文本文件的只读访问 日志 转储 跟踪等 对于少量数据 suitable Document and JTextComponent都很好 如图所示here 我理解浏览大量数据的
  • 如何在此正则表达式中允许空格?

    我是正则表达式的业余爱好者 如何在这个正则表达式中允许空格 不管有多少 if preg match A Za z0 9 str return FALSE if preg match A Za z0 9 str return FALSE 请注
  • int 除以 unsigned int 导致翻转

    我尝试将 int 除以 unsigned int 得到了意想不到的结果 int b unsigned int c int res float res f b 25 c 5 res b c res 858993454 res f b c re
  • 为什么我的 ttk.Treeview 单击处理程序在 tree.focus() 上返回错误的项目?

    我有一个简单的脚本 使用ttk Treeview我正在用文件系统树的内容填充的实例 我想在单击 叶 项目时执行特定操作 因此我配置了一个处理程序 如下所示 self tree tag bind entry lt 1 gt self onCl
  • 如何滚动两个 JTextPane?

    我是一个使用 NetBeans 的 Swing 新手 我想垂直滚动两个并排的 JTextPane 滚动应该同步并通过单个滚动条完成 如果我从 NetBean 设计器添加 JTextPanes 它们会自动放入 JScrollPane 中 以便
  • 带 spring 的瓷砖:出现错误 - java.lang.ClassNotFoundException:org.apache.tiles.TilesApplicationContext

    我是 Spring 新手 尝试在 Spring 中使用瓷砖 但出现以上错误 我在我的项目中使用maven 我也尝试过更改版本 但没有用 项目内容如下 pom xml
  • 配置安全 SSL Apache 反向代理

    我正在尝试使用 apache 建立一个反向代理设置 该设置始终安全地支持 SSL Client lt gt Proxy somehostname com lt gt Server 123 45 67 89 请注意 我的代理服务器有主机名 但
  • IOS取消本地通知

    我不喜欢问模糊的问题 但我无法准确说出问题是什么 在我的应用程序中 我设置了一些每日本地通知 每天下午200点拍摄 后来我删除了设置本地通知的代码 并添加了推送通知功能 我测试了推送并且它有效 只要我愿意 但我仍然收到旧的通知 可能是因为我
  • 从本地文本文件读取到 C# 中? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经搜索并只找到了控制台的此信息 但我想知道是否可以将本地计算机上的文件中的文本读取到代码中 格式化它并显示在屏幕上 我们有一个包含一些法律术语的文本文件 可以定期更新 而不是让用
  • 如何在CUDA中使用多态性

    我正在将一些物理模拟代码从 C 移植到 CUDA 基本算法可以理解为 对向量的每个元素应用一个运算符 在伪代码中 模拟可能包括以下内核调用 apply Operator o Vector v 例如 apply add three opera
  • 编译后从类路径中删除条目

    我有一个遗留的战争项目 它依赖于一个jar项目 该jar项目需要添加一些非托管jar到类路径用于编译 但这些罐子不应该在战争中打包 所以我的问题是如何从完整类路径 以下内容将不起作用 val excludeFilter servlet ap
  • 从服务器端调用Javascript函数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 单击按钮时 我正在调用服务器端函数 其中我正在调用 Javascript 函数 例如 Page ClientScript RegisterStartupScript this Get
  • Django 迁移错误 - NodeNotFoundError

    Django 版本 1 8 尝试迁移我的项目中新添加的应用程序 这是回溯错误 Traceback most recent call last File manage py line 10 in
  • 如何融化Spark DataFrame?

    PySpark 或至少 Scala 中的 Apache Spark 中是否有等效的 Pandas Melt 函数 到目前为止 我一直在 Python 中运行示例数据集 现在我想对整个数据集使用 Spark 火花 gt 3 4 在 Spark