删除Spark数据帧中具有句点的列名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除Spark数据帧中具有句点的列名称相关的知识,希望对你有一定的参考价值。

我在使用具有句点的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')]

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

答案

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

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

但是,当您试图放弃时:

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

以上是关于删除Spark数据帧中具有句点的列名称的主要内容,如果未能解决你的问题,请参考以下文章

过滤包含Scala Spark数据帧中数组的列中的数组长度[重复]

当函数在具有自动检测模式的 spark 数据帧中不起作用时

控制 spark-sql 和数据帧中的字段可空性

用名称中的句点重命名clickhouse中的列

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

获取被筛选器从 spark 数据帧中删除的行的示例