AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-2153235

user2153235's questions

Martin Hope
user2153235
Asked: 2024-09-05 05:29:30 +0800 CST

PySpark 窗口函数:如果 WindowSpec 具有排序,则聚合会有所不同

  • 6

我正在研究PySpark 的聚合函数这个示例Window。

这是数据框:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()
simpleData = (("James", "Sales", 3000), \
    ("Michael", "Sales", 4600),  \
    ("Robert", "Sales", 4100),   \
    ("Maria", "Finance", 3000),  \
    ("James", "Sales", 3000),    \
    ("Scott", "Finance", 3300),  \
    ("Jen", "Finance", 3900),    \
    ("Jeff", "Marketing", 3000), \
    ("Kumar", "Marketing", 2000),\
    ("Saif", "Sales", 4100) \
  )
columns= ["employee_name", "department", "salary"]
df = spark.createDataFrame(data = simpleData, schema = columns)
+-------------+----------+------+
|employee_name|department|salary|
+-------------+----------+------+
|James        |Sales     |3000  |
|Michael      |Sales     |4600  |
|Robert       |Sales     |4100  |
|Maria        |Finance   |3000  |
|James        |Sales     |3000  |
|Scott        |Finance   |3300  |
|Jen          |Finance   |3900  |
|Jeff         |Marketing |3000  |
|Kumar        |Marketing |2000  |
|Saif         |Sales     |4100  |
+-------------+----------+------+

教程中的一个 WindowSpec 按“部门”对行进行分区,并按每个部门内的“薪水”排序:

from pyspark.sql.window import Window
windowSpec  = Window.partitionBy("department").orderBy("salary")

为了熟悉Window操作,我尝试添加一个列“MaxRowNum”,其中包含每个分区内的最大行数。为了方便起见,中间列“RowNum”包含每个分区内的行数:

from pyspark.sql.functions import row_number
df \
.withColumn('RowNum',row_number().over(windowSpec)) \
.withColumn('MaxRowNum',max(col('RowNum')).over(windowSpec)) \
.show()
+-------------+----------+------+------+---------+
|employee_name|department|salary|RowNum|MaxRowNum|
+-------------+----------+------+------+---------+
|        Maria|   Finance|  3000|     1|        1|
|        Scott|   Finance|  3300|     2|        2|
|          Jen|   Finance|  3900|     3|        3|
|        Kumar| Marketing|  2000|     1|        1|
|         Jeff| Marketing|  3000|     2|        2|
|        James|     Sales|  3000|     1|        2|
|        James|     Sales|  3000|     2|        2|
|       Robert|     Sales|  4100|     3|        4|
|         Saif|     Sales|  4100|     4|        4|
|      Michael|     Sales|  4600|     5|        5|
+-------------+----------+------+------+---------+

如上所示,“RowNum”值是正确的,但“MaxRowNum”不包含每个分区内的最大行数。它们仅包含行数,但绑定行除外,绑定行包含两个行数中较大的一个。

从本教程的后面部分开始,我发现了一个没有排序的 WindowSpec,它给了我正确的结果(参见“MaxRowCORRECT”列):

windowSpecAgg  = Window.partitionBy("department") # No sorting

df.withColumn("row",row_number().over(windowSpec)) \
  .withColumn('MaxRowNum',max(col('row')).over(windowSpec)) \
  .withColumn("MaxRowCORRECT",max(col("row")).over(windowSpecAgg)) \
  .show()
+-------------+----------+------+---+---------+-------------+
|employee_name|department|salary|row|MaxRowNum|MaxRowCORRECT|
+-------------+----------+------+---+---------+-------------+
|        Maria|   Finance|  3000|  1|        1|            3|
|        Scott|   Finance|  3300|  2|        2|            3|
|          Jen|   Finance|  3900|  3|        3|            3|
|        Kumar| Marketing|  2000|  1|        1|            2|
|         Jeff| Marketing|  3000|  2|        2|            2|
|        James|     Sales|  3000|  1|        2|            5|
|        James|     Sales|  3000|  2|        2|            5|
|       Robert|     Sales|  4100|  3|        4|            5|
|         Saif|     Sales|  4100|  4|        4|            5|
|      Michael|     Sales|  4600|  5|        5|            5|
+-------------+----------+------+---+---------+-------------+

我的理解是,窗口聚合函数对每个分区的整体进行操作。上面的代码表明情况不一定如此。我浏览了 Windows 文档,但找不到这种条件行为的明确描述。

是否有一致且完整记录的 Windows 函数操作方案?我在文档中的哪个地方遗漏了它?

背景

根据mazaneicha 的回答,我意识到我需要了解窗口函数分类的背景知识。PySpark 链接到相关术语会产生空白页(currentRow、unboundedPreceding、 unboundedFollowing)。这些东西似乎来自 SQL。虽然我没有在rowFrame和上找到任何内容,但以下页面提供了上述其他术语的背景知识( rowsBetweenrangeFrame的文档也是如此):

  • https://mode.com/sql-tutorial/sql-window-functions
  • https://www.geeksforgeeks.org/window-functions-in-sql
  • https://www.databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
  • 如何在 PySpark 中的 rowsBetween 中使用 unboundedPreceding、unboundedFollowing 和 currentRow
apache-spark
  • 1 个回答
  • 33 Views
Martin Hope
user2153235
Asked: 2024-08-24 04:46:13 +0800 CST

在*简单*的例子中很难看出装饰器的动机

  • 6

我在网上浏览了一些关于装饰器的教程。我很难从简单的例子看出它们的好处。这是一个需要装饰的函数的常见例子,取自此页面:

# Unelegant decoration
#---------------------
def make_pretty(func):

    def inner():
        print("I got decorated")
        func()
    return inner

def ordinary():
    print("I am ordinary")

decorated_func = make_pretty(ordinary)
decorated_func()
    # Output
    #-------
    # I got decorated
    # I am ordinary

装饰器的好处被描述如下:“Python 提供了一种更优雅的方式来实现此功能,而不是将函数调用分配给变量”。

# Elegant decoration
#-------------------
@make_pretty
def ordinary():
    print("I am ordinary")

ordinary()
    # Output
    #-------
    # I got decorated
    # I am ordinary

其他教程提供了类似的示例和类似的动机,例如这里。

我对这个解释的困难在于,它不太符合在不修改要装饰的函数的情况下为其添加功能的意图(装饰器的另一种常见解释)。在上面的例子中,未装饰的“ordinary()”不再可用,因此装饰它实际上并不会让原始函数在不需要或不需要装饰的情况下可用。

另一个更具体的动机是通过“不将函数调用分配给变量”来获得更大的优雅性。然而,对于“不优雅的装饰”代码,这很容易在没有上面的“优雅的装饰”代码的情况下实现:

make_pretty(ordinary)()
    # Output
    #-------
    # I got decorated
    # I am ordinary

教程通常通过描述函数接受参数的情况下的装饰器来进行。我无法理解它们的动机,因为我甚至无法理解上面最简单的情况下的好处。因此,问答也谈到了实际用例(例如,此处),但很难理解装饰器的原因,同样,当上面最简单的情况下的动机不清楚时。

能否用通俗易懂的语言说明上述最简单的情况下,没有函数参数的好处是什么?还是只有通过某种方式弄清楚更复杂的情况,好处才会变得清晰?

python
  • 1 个回答
  • 34 Views
Martin Hope
user2153235
Asked: 2024-07-24 00:10:19 +0800 CST

模块导入到不同的范围,它们是否都引用同一个对象?

  • 5

在 Spyder 控制台 (REPL) 上,我发出import matplotlib.pyplot as plt。它是最顶层的命名空间,即对应于globals()。

在Spyder启动文件中,我定义了一个函数来将图形窗口提升到顶部。

def TKraiseCFG( FigID = None ):

   import matplotlib.pyplot as plt

   # The rest is just context
   #-------------------------
   # Assigning to plt unnecessary if
   # imported plt is same object as in
   # caller's scope
   plt = inspect.currentframe().f_back.f_globals['plt'] # plt=globals()['plt']
      # https://stackoverflow.com/a/78732915
   if FigID is not None: plt.figure( FigID )
   cfm = plt.get_current_fig_manager()
   cfm.window.attributes('-topmost', True)
   cfm.window.attributes('-topmost', False)
   return cfm

in引用plt的对象和REPL 引用的TKraiseCFG()对象是同一个吗?plt

进一步的背景(不是主要问题): 我无法想象一个控制台/REPL(甚至多个控制台)使用多个matplotlib.pyplot。但我刚刚开始了解Python,所以我可能是错的。matplotlib.pyplot但是,对于单个公共的情况,我正在寻找一种让所有范围都可以访问它的方法,以便我可以编写类似的便利/实用函数TKraiseCFG()(几周前在阅读各种页面后拼凑起来的)。不幸的是,我当前的方法要求代码调用包含一个专门名为referencing 的TKraiseCFG()变量。pltmatplotlib.pyplot

python
  • 1 个回答
  • 37 Views
Martin Hope
user2153235
Asked: 2024-07-04 00:24:27 +0800 CST

pyplot.plot 使用 markerfacecolor 而 pyplot.scatter 使用 facecolor

  • 6

我来自 Matlab 背景,这对我有启发matplotlib(或者说我理解如此,无论对错)。

我很惊讶地发现,不同图的类似选项使用了不同的选项名称。例如,pyplot.plot使用markerfacecolor而pyplot.scatter使用facecolor。

在 Matlab 中,这些选项在各个图中很常见。我想知道这些差异是如何产生的matplotlib.pyplot。不同的图是由不同的小组开发的吗?

python
  • 1 个回答
  • 23 Views
Martin Hope
user2153235
Asked: 2024-06-11 23:05:12 +0800 CST

“levenshtein”和“python levenshtein”包之间的区别?

  • 5

我从 conda-forge 安装了levenshtein模块。我不记得使用了确切的命令,但它可能类似于conda install -c conda-forge PackageName。我查询了软件包版本。我看到两个软件包的版本号完全相同:

(py39) C:\>conda list levenshtein$
# packages in environment at C:\Users\User.Name\AppData\Local\anaconda3\envs\py39:
#
# Name             Version          Build Channel
levenshtein        0.25.1  py39h99910a6_0 conda-forge
python-levenshtein 0.25.1    pyhd8ed1ab_0 conda-forge

该版本与我在这里和这里在线找到的版本相匹配。我还可以在 GitHube 上找到这两个版本,这里、这里和这里。

为了尝试了解它们是否不同,我使用 Cygwin 的 Bash 导航到 Conda 环境文件夹/c/Users/User.Name/AppData/Local/anaconda3/envs/py39并搜索与包相关的文件:

$ find * -name '*levenshtein*' -print | xargs ls -l
  7270 Jun  7 17:13 conda-meta/levenshtein-0.25.1-py39h99910a6_0.json
  4564 Jun  7 17:13 conda-meta/python-levenshtein-0.25.1-pyhd8ed1ab_0.json
  3951 Jan 27  2023 Lib/site-packages/gensim/similarities/__pycache__/levenshtein.cpython-39.pyc
  4505 Jan 27  2023 Lib/site-packages/gensim/similarities/levenshtein.py
219136 Apr  7 12:12 Lib/site-packages/Levenshtein/levenshtein_cpp.cp39-win_amd64.pyd

我不确定如何解释这些发现。查看前 2 个 JSON 文件,我看到可能相关的选定行

levenshtein-0.25.1-py39h99910a6_0.json
--------------------------------------
"extracted_package_dir": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\levenshtein-0.25.1-py39h99910a6_0",
"fn": "levenshtein-0.25.1-py39h99910a6_0.conda",
  "source": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\levenshtein-0.25.1-py39h99910a6_0",
"package_tarball_full_path": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\levenshtein-0.25.1-py39h99910a6_0.conda",

python-levenshtein-0.25.1-pyhd8ed1ab_0.json
-------------------------------------------
"extracted_package_dir": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\python-levenshtein-0.25.1-pyhd8ed1ab_0",
"fn": "python-levenshtein-0.25.1-pyhd8ed1ab_0.conda",
  "source": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\python-levenshtein-0.25.1-pyhd8ed1ab_0",
"package_tarball_full_path": "C:\\Users\\User.Name\\AppData\\Local\\anaconda3\\pkgs\\python-levenshtein-0.25.1-pyhd8ed1ab_0.conda",

这两个软件包实际上是相同的吗?如果是,为什么它们会以不同名称的软件包形式出现?如何检查一个通用软件包是否通过两个不同的名称提供?

python
  • 1 个回答
  • 26 Views
Martin Hope
user2153235
Asked: 2024-06-11 01:53:57 +0800 CST

有关整个系列中常见的数据类型的更多详细信息?

  • 6

我有一个完全由通用类型组成的数据框列dict。有没有办法查询Series类型以揭示常见的数据类型?它目前只告诉我它是一个对象,我理解它是一个引用数组。但是,如果整个系列所引用的事物属于同一类型,那么了解这一事实以及特定的常见类型将会很有用。

>>> df = pd.DataFrame([[{'c':[1,2]}],[{'d':[3,4]}]],columns=['A'])
                  A
   0  {'c': [1, 2]}
   1  {'d': [3, 4]}

>>> df['A'].dtype
   dtype('O')

>>> type(df['A'])
   pandas.core.series.Series
python
  • 1 个回答
  • 22 Views
Martin Hope
user2153235
Asked: 2023-12-17 14:19:19 +0800 CST

当构造函数创建一个新实例时,为什么 Java 需要“new”[重复]

  • 8
这个问题在这里已经有了答案:
java中的new关键字是多余的吗? (5 个回答)
java为什么要有new?[重复] (6 个回答)
10 小时前关闭。

我在网上搜索了Java中“new”的用法,它是用于创建一个全新的类实例。为什么需要通过“new”关键字明确指示?难道不明白构造函数调用会实例化一个新对象吗?例如,如果没有new,很明显会MyClass AnInstance = MyClass(AnArgument)创建一个新对象。

从实际角度来看,我提出这个问题的原因是因为我认为“新”是为了防范危险而设计的,并且我想了解这种危险。

java
  • 4 个回答
  • 133 Views
Martin Hope
user2153235
Asked: 2023-10-31 13:05:19 +0800 CST

DataFrame.colRegex 中的反引号?

  • 5

对于 PySpark,我发现反引号包含了 DataFrame.colRegex() 这里、 这里和这个 SO 问题的正则表达式。这是文档字符串的示例DataFrame.colRegex:

df = spark.createDataFrame([("a", 1), ("b", 2), ("c",  3)], ["Col1", "Col2"])
df.select(df.colRegex("`(Col1)?+.+`")).show()
+----+
|Col2|
+----+
|   1|
|   2|
|   3|
+----+

SO 问题的 答案不会显示 Scala 的反引号。Pattern 它引用了该类的 Java 文档,但这并没有解释反引号。

此页面 指示在 Python 中使用反引号来表示修饰变量的字符串表示形式,但这不适用于正则表达式。

反引号的解释是什么?

python
  • 1 个回答
  • 11 Views
Martin Hope
user2153235
Asked: 2023-10-08 13:41:45 +0800 CST

将 CSV 读入 Spark DataFrame 的两种方法有何不同?

  • 6

通过遵循此Spark 示例 教程 (以及同一站点上的其他教程),我逐渐熟悉了 Python、Spark 和 PySpark 的基础知识。一开始,他们提供了三种读取同一文件的方法:

spark.read.csv("/tmp/resources/zipcodes.csv")
spark.read.format("csv") \
                  .load("/tmp/resources/zipcodes.csv")
spark.read.format("org.apache.spark.sql.csv") \
                  .load("/tmp/resources/zipcodes.csv")

这里,spark是 类 的一个对象 pyspark.sql.session.SparkSession。该课程指出,第二个和第三个命令是第一个命令的替代命令,但用于“完全限定的数据源名称”。不幸的是,PySpark 中的文档字符串非常简洁。然而,所有三个示例都使用了完全限定路径,因此命令的解释spark.read.format 似乎非常不完整。

方法调用之间有什么区别?对我来说,需要一个全新的专用csv方法来专门处理 CSV,这似乎很奇怪——除非它只是format 具有 CSV 特定便利性的方法的包装器。

我发现了什么

我发现的一个内容丰富的页面是SaturnCloud 页面,但我对该format方法更通用且速度更慢的解释感到困惑。如果该方法是包装器,我看不到这种情况csv- 除非摄取器是以高度次优的方式设置的,并且在每个记录、每个字段或每个字符的基础上有大量控制流。

同一站点还将该csv方法称为 format("csv"). 这表明它甚至不提供包装器可能提供的任何附加功能,并且它根本不应该变慢。所以这个网站是自相矛盾的。

此页面 将该csv方法称为 的“快捷方式” format("csv")。同样,这给人一种感觉,它是一个薄包装器,但这与 SaturnCloud 的指示(可能存在性能差异)不一致,也不符合Spark By Examples的暗示(它们适用于不同形式的数据源名称)。

有关差异的问题之前已作为 Stack Overflow 评论提出 。

csv
  • 1 个回答
  • 26 Views
Martin Hope
user2153235
Asked: 2023-09-17 13:49:25 +0800 CST

Python 中 ContainerType[str, ...] 是什么意思?[复制]

  • 6
这个问题在这里已经有了答案:
Python 中的 TypeHinting 元组 (2 个答案)
20 小时前关闭。

我意识到 Python 实际上并没有重载函数,而是暗示了方法输入/输出参数的多种可接受的类型。就其本身而言,这不允许指定哪些输入类型产生哪些返回类型。因此,使用@overload装饰器来指定多个可接受的类型提示原型。这是我阅读多个网页的综合,如果不完全正确,谢谢纠正。

PySpark 包有一个rdd.py包含以下方法原型的模块:

@overload
def toDF(
    self: "RDD[RowLike]",
    schema: Optional[Union[List[str], Tuple[str, ...]]] = None,
    sampleRatio: Optional[float] = None,
) -> "DataFrame":
    ...

我试图找到有关如何解释的信息Tuple[str, ...]。

本页讨论一般容器参数的类型提示,但不讨论在作为容器类型后缀的方括号内的具体类型后面的省略号的含义。

省略号不喜欢它在切片的上下文中,这是我在网上看到的另一个用途。

省略号的作用不同于表示无操作主体,例如pass。

我该如何解读Tuple[str, ...]?

python
  • 1 个回答
  • 32 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve