首页 文章

Spark Dataframe验证镶木地板写入的列名(scala)

提问于
浏览
3

我正在使用从JSON事件流转换而来的Dataframes来处理事件,这些事件最终会像Parquet格式一样被写出来 .

但是,一些JSON事件在键中包含空格,我想在将它转换为Parquet之前从数据框中记录和过滤/删除这些事件,因为,; {}()\ n \ t =被认为是Parquet中的特殊字符架构(CatalystSchemaConverter),如 [1] below 中所列,因此不应在列名中使用 .

如何在Dataframe上对列名进行此类验证,并完全删除此类事件,而不会错误化Spark Streaming作业 .

[1] Spark的CatalystSchemaConverter

def checkFieldName(name: String): Unit = {
    // ,;{}()\n\t= and space are special characters in Parquet schema
    checkConversionRequirement(
      !name.matches(".*[ ,;{}()\n\t=].*"),
      s"""Attribute name "$name" contains invalid character(s) among " ,;{}()\\n\\t=".
         |Please use alias to rename it.
       """.stripMargin.split("\n").mkString(" ").trim)
  }

3 回答

  • 1

    我对包含空格的列名有同样的问题 .
    解决方案的第一部分是将名称放在反引号中 .
    解决方案的第二部分是用下划线替换空格 .

    抱歉,我只准备了pyspark代码:

    from pyspark.sql import functions as F
    
    df_tmp.select(*(F.col("`" + c+ "`").alias(c.replace(' ', '_')) for c in df_tmp.columns)
    
  • 0

    使用 alias 更改字段名称而不使用这些特殊字符 .

  • 0

    尝试使用正则表达式替换坏符号 . 检查我的answer .

相关问题