【发布时间】: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