pyspark无法解析给定输入列“`col.name`:[col.name]-col name中的点”

yyyllmsg  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(496)

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|
+--------+------------+

根据文件
pyspark.sql.functions.col(col)返回基于给定列名的列。
第一次尝试应该有效。
你知道为什么没有吗?

ie3xauqp

ie3xauqp1#

如果我们用 struct 类型(structtype)。

>>> 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]|
+--------+---+

这里我们的目标是获取嵌套字段的值 namestruct 字段 col :

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

这里我们的目标是得到单个列的值 col.name :

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

相关问题