代码之家  ›  专栏  ›  技术社区  ›  Yu Chen little_birdie

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

  •  1
  • Yu Chen little_birdie  · 技术社区  · 6 年前

    我很难在有周期的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')]
    

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Yu Chen little_birdie    6 年前

    select() drop()

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

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