【问题标题】:pyspark cannot resolve '`col.name`' given input columns: [col.name] - dot in col namepyspark 无法解析给定输入列的“col.name”:[col.name] - col 名称中的点
【发布时间】:2020-11-26 11:20:59
【问题描述】:

Spark 版本 2.4.5 版

>> from pyspark.sql.functions import col

>> data = [('a',),
        ('b',)]

>> df = spark.createDataFrame(data, ("col.name",))

>> df.printSchema()
root
 |-- col.name: string (nullable = true)

这一行的执行

>> df.withColumn("col.name.new",col("col.name")).show()

给出这个错误

Traceback (most recent call last):
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o1187.withColumn.
: org.apache.spark.sql.AnalysisException: cannot resolve '`col.name`' given input columns: [col.name]

但是这行得通

>> df.withColumn("col.name.new",col("`col.name`")).show()
+--------+------------+
|col.name|col.name.new|
+--------+------------+
|       a|           a|
|       b|           b|
+--------+------------+

根据documentation

pyspark.sql.functions.col(col) 根据给定的列名返回一个列。

第一次尝试应该会成功。

你知道为什么没有吗?

【问题讨论】:

  • 我无法将其标记为重复,但我已经回答了这个问题here。它是由bug 引起的。
  • 谢谢@cronoik,你知道这是否也适用于spark>=3.0.0?
  • 嗯,根据错误报告应该不是这种情况,但我没有测试过。
  • 我检查了 spark==3.0.1 这仍然是一个错误。
  • 很高兴知道。这意味着您仍应避免使用点或替换列名。

标签: apache-spark pyspark


【解决方案1】:

如果我们查看具有 struct 类型 (StructType) 的字段,则 In 将是有意义的。

>>> from pyspark.sql.functions import col, from_json
>>> data = [('a','{"name":1}'),
...         ('b','{"name":2}')]
>>> df = spark.createDataFrame(data, ("col.name","col"))
>>> df = df.withColumn("col",from_json(df.col,"name INT"))

>>> df.printSchema()
root
 |-- col.name: string (nullable = true)
 |-- col: struct (nullable = true)
 |    |-- name: integer (nullable = true)

>>> df.show()
+--------+---+
|col.name|col|
+--------+---+
|       a|[1]|
|       b|[2]|
+--------+---+

在这里,我们的目标是获取 struct 字段 col 的嵌套字段 name 的值:

>>> df.select(col("col.name")).show()  
+----+
|name|
+----+
|   1|
|   2|
+----+

这里我们的目标是获取单列col.name的值:

>>> df.select(col("`col.name`")).show()
+--------+
|col.name|
+--------+
|       a|
|       b|
+--------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2021-02-07
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多