Python 删除Spark dataframe中有句点的列名
在Spark数据帧中删除一个有周期的列时遇到问题。我知道您需要使用倒勾(`)来转义列名。当我尝试选择列时,这就起作用了,事实上,我已经编写了自己的小静态函数来转义所有列名:Python 删除Spark dataframe中有句点的列名,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,在Spark数据帧中删除一个有周期的列时遇到问题。我知道您需要使用倒勾(`)来转义列名。当我尝试选择列时,这就起作用了,事实上,我已经编写了自己的小静态函数来转义所有列名: @staticmethod def escape(列): 返回[“`+col+”`“if.”在col-else列中表示col-in列中的col] 然后,可以使用此选项获取所需的列列表,以便通过以下方式进行选择: required_columns=MySparkClass.escape( 列表(筛选器(lambda col:
@staticmethod
def escape(列):
返回[“`+col+”`“if.”在col-else列中表示col-in列中的col]
然后,可以使用此选项获取所需的列列表,以便通过以下方式进行选择:
required_columns=MySparkClass.escape(
列表(筛选器(lambda col:re.search('targetregexstufhere',col),target_df.columns))
)
过滤的_df=df.选择(所需的_列)
使用一个简单、可重复的示例:
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')
)
打印(相同的.select('`label.X.L.`').collect())
这里的输出是:
[行(label.X.L.='A')、行(label.X.L.='B')、行(label.X.L.='A')、行(label.X.L.='B')]
但是,删除反勾号会导致出现AnalysisException
:
pyspark.sql.utils.AnalysisException:“属性名称中的语法错误:label.X.L.;”
但是,当我尝试删除label.X.L.
列时,反勾号似乎没有任何区别:
print(相同的.drop('`label.X.L.`').collect())
输出为
[行(索引=1,X=1,标签.X.L.='A',日期='2017-01-01'),
行(索引=2,X=3,标签X.L.='B',日期='2017-01-02'),
世界其他地区(索引=3,X=5,标签X.L.='A',日期='2017-01-03'),
世界其他地区(索引=4,X=7,标签X.L.='B',日期='2017-01-04')]
删除名称中包含句点的列的正确方法是什么?指定用于
select()
和drop()
的列的语法略有不同。当您的列名中有一个句点表示select()
:
但是,当您尝试删除时:
same.drop('label.X.L.') # note the absence of the backticks
你能加一个吗?我无法复制你的问题。请阅读更多内容。另一种删除列的方法是选择所有其他列:
df=df.select(*[c代表df.columns中的c,如果c!=“favorite_country_.U.S.A]”)
@pault我添加了一个有趣的示例-drop()
似乎对我有效,没有背景标记:print(same.drop('label.X.L.).collect())
-什么版本的spark?@pault嗯,你说得对。我觉得自己像个白痴。如果我只是执行打印(same.drop('label.X.L.)).collect())
我就得到了所需的输出。所以看起来drop()
不需要反勾号,但是select()
需要反勾号?
same.drop('label.X.L.') # note the absence of the backticks