【问题标题】:Dropping a column name that has a period in Spark dataframe在 Spark 数据框中删除具有句点的列名
【发布时间】:2023-03-28 18:11:01
【问题描述】:

我在删除带有句点的 Spark 数据框中的列时遇到问题。我知道您需要使用反引号 (`) 转义列名。这在我尝试选择列时有效,实际上我已经编写了自己的小静态函数来转义所有列名:

@staticmethod
def escape(columns):
    return ["`" + col + "`" if "." in col else col for col in columns]

这可以用来获取我想要的列列表以供选择:

desired_columns = MySparkClass.escape(
    list(filter(lambda col: re.search('targetRegexStuffHere', col), target_df.columns))
)

filtered_df = df.select(desired_columns)

使用一个简单的、可重现的例子:

same = sqlContext.createDataFrame(
    [
        (1, 1, 'A', '2017-01-01'),
        (2, 3, 'B', '2017-01-02'),
        (3, 5, 'A', '2017-01-03'),
        (4, 7, 'B', '2017-01-04')
    ],
    ('index', 'X', 'label.X.L.', 'date')
)

print(same.select('`label.X.L.`').collect())

这里的输出是:

[Row(label.X.L.='A'), Row(label.X.L.='B'), Row(label.X.L.='A'), Row(label.X.L.='B')]

但是,删除反引号会导致 AnalysisException

pyspark.sql.utils.AnalysisException: 'syntax error in attribute name: label.X.L.;'

但是,当我尝试删除 label.X.L. 列时,反引号似乎没有任何区别:

print(same.drop('`label.X.L.`').collect())

输出是

[Row(index=1, X=1, label.X.L.='A', date='2017-01-01'),
 Row(index=2, X=3, label.X.L.='B', date='2017-01-02'),
 Row(index=3, X=5, label.X.L.='A', date='2017-01-03'),
 Row(index=4, X=7, label.X.L.='B', date='2017-01-04')]

删除名称中包含句点的列的正确方法是什么?

【问题讨论】:

  • 你能加一个minimal reproducible example吗?我无法重现您的问题。请在how to create good reproducible apache spark dataframe examples阅读更多信息。
  • 顺便说一句,另一种删除列的方法是选择所有其他列:df = df.select(*[c for c in df.columns if c != "favorite_country_U.S.A"])
  • @pault 我添加了一个例子
  • 有趣 - drop() 似乎对我有用,没有反引号:print(same.drop('label.X.L.').collect()) - 什么版本的 spark?
  • @pault 嗯,你是对的。我觉得自己像个白痴。如果我只是做print(same.drop('label.X.L.').collect()),我会得到想要的输出。所以看起来drop() 不需要反引号,但select() 需要?

标签: python apache-spark pyspark apache-spark-sql


【解决方案1】:

指定用于select()drop() 的列的语法略有不同。当select() 的列名中有句点时:

same.select('`label.X.L.`') # note the backticks

但是,当您尝试下降时:

same.drop('label.X.L.') # note the absence of the backticks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2017-07-10
    • 2014-02-27
    • 2018-03-28
    • 2021-11-26
    相关资源
    最近更新 更多