[英]Dropping a column name that has a period in Spark dataframe
我无法在具有句点的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.XL
列时,反引号似乎没有任何区别:
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')]
删除名称中包含句点的列的正确方法是什么?
指定用于select()
和drop()
列的语法略有不同。 当您的select()
列名称中有句点时:
same.select('`label.X.L.`') # note the backticks
但是,当您尝试放下时:
same.drop('label.X.L.') # note the absence of the backticks
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.