如何在 Spark SQL 中对多个列进行透视?

2024-01-15

我需要在 PySpark 数据框中旋转多个列。示例数据框:

from pyspark.sql import functions as F
d = [(100,1,23,10),(100,2,45,11),(100,3,67,12),(100,4,78,13),(101,1,23,10),(101,2,45,13),(101,3,67,14),(101,4,78,15),(102,1,23,10),(102,2,45,11),(102,3,67,16),(102,4,78,18)]
mydf = spark.createDataFrame(d,['id','day','price','units'])
mydf.show()
# +---+---+-----+-----+
# | id|day|price|units|
# +---+---+-----+-----+
# |100|  1|   23|   10|
# |100|  2|   45|   11|
# |100|  3|   67|   12|
# |100|  4|   78|   13|
# |101|  1|   23|   10|
# |101|  2|   45|   13|
# |101|  3|   67|   14|
# |101|  4|   78|   15|
# |102|  1|   23|   10|
# |102|  2|   45|   11|
# |102|  3|   67|   16|
# |102|  4|   78|   18|
# +---+---+-----+-----+t

现在,如果我需要根据日期将每个 id 的价格列放入一行,那么我可以使用pivot method:

pvtdf = mydf.withColumn('combcol', F.concat(F.lit('price_'), mydf['day'])).groupby('id').pivot('combcol').agg(F.first('price'))
pvtdf.show()
# +---+-------+-------+-------+-------+
# | id|price_1|price_2|price_3|price_4|
# +---+-------+-------+-------+-------+
# |100|     23|     45|     67|     78|
# |101|     23|     45|     67|     78|
# |102|     23|     45|     67|     78|
# +---+-------+-------+-------+-------+

因此,当我还需要将单位列转置为价格时,我必须为单位再创建一个如上所述的数据框,然后join两者都使用“id”。但是,当我有更多这样的列时,我尝试了一个函数来做到这一点,

def pivot_udf(df, *cols):
    mydf = df.select('id').drop_duplicates()
    for c in cols:
       mydf = mydf.join(df.withColumn('combcol', F.concat(F.lit('{}_'.format(c)), df['day'])).groupby('id').pivot('combcol').agg(F.first(c)),' id')
    return mydf

pivot_udf(mydf, 'price', 'units').show()
# +---+-------+-------+-------+-------+-------+-------+-------+-------+
# | id|price_1|price_2|price_3|price_4|units_1|units_2|units_3|units_4|
# +---+-------+-------+-------+-------+-------+-------+-------+-------+
# |100|     23|     45|     67|     78|     10|     11|     12|     13|
# |101|     23|     45|     67|     78|     10|     13|     14|     15|
# |102|     23|     45|     67|     78|     10|     11|     16|     18|
# +---+-------+-------+-------+-------+-------+-------+-------+-------+

这样做是一个好的做法吗?还有其他更好的方法吗?


这是涉及单个数据透视的非 UDF 方法(因此,只需进行单列扫描即可识别所有唯一日期)。

dff = mydf.groupBy('id').pivot('day').agg(F.first('price').alias('price'),F.first('units').alias('unit'))

这是结果(对不匹配的排序和命名表示歉意):

+---+-------+------+-------+------+-------+------+-------+------+               
| id|1_price|1_unit|2_price|2_unit|3_price|3_unit|4_price|4_unit|
+---+-------+------+-------+------+-------+------+-------+------+
|100|     23|    10|     45|    11|     67|    12|     78|    13|
|101|     23|    10|     45|    13|     67|    14|     78|    15|
|102|     23|    10|     45|    11|     67|    16|     78|    18|
+---+-------+------+-------+------+-------+------+-------+------+

我们只是将两者汇总priceunit当天旋转后的专栏。

如果需要命名,

dff.select([F.col(c).name('_'.join(x for x in c.split('_')[::-1])) for c in dff.columns]).show()

+---+-------+------+-------+------+-------+------+-------+------+
| id|price_1|unit_1|price_2|unit_2|price_3|unit_3|price_4|unit_4|
+---+-------+------+-------+------+-------+------+-------+------+
|100|     23|    10|     45|    11|     67|    12|     78|    13|
|101|     23|    10|     45|    13|     67|    14|     78|    15|
|102|     23|    10|     45|    11|     67|    16|     78|    18|
+---+-------+------+-------+------+-------+------+-------+------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Spark SQL 中对多个列进行透视? 的相关文章

  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp

随机推荐

  • Vue:等待渲染,直到安装所有组件

    我有一个 Vue Nuxt Web 应用程序 其中页面是从许多具有子组件的组件动态生成的 问题是页眉和页脚首先渲染 然后是具有实际内容的子组件 第一次加载时这看起来很糟糕 而且 Lighthouse 不喜欢它 这是一个Avoid large
  • 使用自动布局将堆栈视图垂直定向为纵向,水平定向为横向

    获得纵向垂直堆栈视图以横向水平对齐的最佳方法是什么 我尝试过代码和自动布局解决方案 但它们不起作用 有没有简单的方法可以在故事板中做到这一点 您需要以编程方式更新axis的财产UIStackView https developer appl
  • web.py 和 Gunicorn

    我的问题基本上是标题中的内容 如何设置gunicorn来运行web py应用程序 另外 如果有任何差异 我将如何在heroku上做到这一点 我已经使用内置的cherrypy在heroku上运行了我的应用程序 但我无法让gunicorn与we
  • SQL正则表达式获取电话号码

    我想获取满足特定条件的文本字符串的电话号码 9个字符 数字 只能从9 8 7 6开始 我尝试使用以下表达式 9 8 7 6 0 9 8 在以下函数中 DECLARE str VARCHAR MAX DECLARE validchars VA
  • OR 条件的流畅断言

    我正在尝试为以下条件设置流畅的断言 但找不到带有表达式的方法或带有 Or 的对象断言 我必须检查我的服务状态是否具有枚举值Pending or Active services Should HaveCount totalServices A
  • Laravel 5:如果用户已登录,则更改导航栏

    总的来说 我对 Laravel MVC 和模板引擎完全陌生 如果用户登录 我需要显示某些导航栏按钮和选项 例如 通知 注销 个人资料等 以及登录按钮 非常感谢任何关于如何以正确的方式解决这个问题的帮助 这是我目前正在考虑的 A User对象
  • mysql 不尊重 my.cnf 中的 wait_timeout 设置

    我在 my cnf 中设置了 wait timeout 并重新启动了服务器 但空闲连接的时间继续增长 超过了我设置的默认 100 秒 有什么想法为什么会发生这种情况吗 PS 我正在运行 ubuntu 12 04 和 Mysql Server
  • WPF:绑定到组合框选定项

    我有一个带有基于 XML 数据的 ComboBox 的 UserControl
  • 使用 MvvmCross 复制预填充 SQLite 数据库的首选方法是什么

    我正在修改 N 10 KittensDb 示例解决方案 我了解如何创建 SQLite 数据库 但我希望使用现有数据库 我猜我需要将数据库复制到正确的 UI 数据文件夹 也许它是在核心项目中完成的 如果是这样 正确的路径如何注入到正在运行的
  • 迭代图中的标记

    我试图用颜色和正确的标签来表示预测作为虹膜数据集的标记 这是我到目前为止所拥有的 from sklearn mixture import GMM import pandas as pd from sklearn import dataset
  • 未捕获的错误:模块解析失败:您可能需要适当的加载器来处理此文件类型

    我在运行业力测试时发现了这个错误 未捕获错误 模块解析失败 G demo my ng2 admin my ng2 admin my ng2 admin node modules awesome typescript loader dist
  • iOS 4.3 UIWebView -webkit-user-select:none;问题

    我一直在开发一个 iPad 应用程序 它使用 UIWebView 来显示一些文本和图像数据 效果很好 但是 我试图阻止用户按住屏幕几秒钟时发生的用户选择 通常的方法似乎在除 iOS 4 3 以外的所有平台上都能正常工作 我尝试了几种不同的方
  • 我应该如何在 pandas eval/query 函数中获取列的符号或检查 isnull() ?

    给定一个 pandas 数据框 我应该如何执行以下操作 df eval B sign A df query A notnull 它不允许我 因为无法识别sign A 和A notnull eval https pandas pydata o
  • vuejs 2 v-for:键不起作用,html 被替换?

    我正在 v for 中渲染一些 HTML 但是每次我更改任何数据时 我的所有 html 都会被替换 输入字段会丢失其值 我尝试给 key 赋予各种不同的值 我在vue v1中没有这个问题 只有在v2中才出现这个问题 http jsbin c
  • 如何编写 Django 查询,在作为 PostGres SQL 执行时执行日期数学运算?

    我正在使用 Django 和 Python 3 7 我正在编写一个在 PostGres 9 4 db 上运行的 Django 查询 但无法弄清楚如何形成我的表达式包装器 以便我向现有日期列添加秒数 整数 我尝试了下面的 hour filte
  • xamarin.android 应用程序签名不起作用

    所以我试图将我的新 Android 应用程序发布到 Google PlayStore 来自阅读this http docs xamarin com guides android deployment testing and metrics
  • DataGrid行虚拟化显示问题

    我们目前有一个DataGrid绑定到一个DataTable 它还具有一个模板列 其中包含CheckBox我们以编程方式添加其中 本专栏的目的是跟踪DataGrid 工厂用于创建CheckBoxes 代表每一行 记录比较多 所以行虚拟化设置为
  • IIS:在.net框架网站下托管.net Core应用程序

    在 ASPNET netframework 网站下托管 ASPNETCore 子应用程序 我有一个托管在 IIS 下的网站 该网站是在 ASP NET MVC 4 中开发的 目标是 NET Framework 4 0 我正在尝试在此网站下添
  • 什么是头等舱公民功能?

    什么是一等公民职能 Java支持一等公民函数吗 Edit 正如提到的维基百科 http en wikipedia org wiki First class function 一流的功能是必要的 对于函数式编程风格 一等函数还有其他用途吗 一
  • 如何在 Spark SQL 中对多个列进行透视?

    我需要在 PySpark 数据框中旋转多个列 示例数据框 from pyspark sql import functions as F d 100 1 23 10 100 2 45 11 100 3 67 12 100 4 78 13 10