Spark Scala中清洗CSV里以Answer开头的HTML格式列问题求助
解决Spark Scala中清洗CSV里Answer开头列的HTML格式问题
我明白你现在的困扰——要批量处理CSV里所有以"Answer"开头的列,把里面的HTML格式内容清洗干净对吧?别担心,咱们一步步来搞定这个问题:
1. 编写通用的HTML清洗函数
首先,咱们需要一个能处理HTML标签的函数。Spark的regexp_replace可以覆盖大部分常见场景,比如移除带属性的HTML标签,还能顺便替换HTML特殊实体(比如 这类占位符):
import org.apache.spark.sql.functions._ def cleanHtmlColumn(col: Column): Column = { // 第一步:移除所有HTML标签(包括带class、id等属性的标签) val removeTags = regexp_replace(col, "<[^>]+>", "") // 第二步:替换常见HTML实体为普通字符 val replaceEntities = regexp_replace(removeTags, " ", " ") .alias(col.toString()) // 保留原列名,避免重命名混乱 replaceEntities }
2. 筛选目标列
接下来,从DataFrame里提取所有以"Answer"开头的列名,不用手动逐个列举:
val answerColumns = df.columns.filter(_.startsWith("Answer"))
3. 批量应用清洗逻辑
用foldLeft遍历所有目标列,批量应用清洗函数,这样不用重复写每一列的处理代码:
val cleanedDf = answerColumns.foldLeft(df) { (tempDf, colName) => tempDf.withColumn(colName, cleanHtmlColumn(col(colName))) }
完整整合示例
把所有步骤整合起来,完整的可复用代码如下:
import org.apache.spark.sql.DataFrame import org.apache.spark.sql.Column import org.apache.spark.sql.functions._ // 定义HTML清洗函数 def cleanHtmlColumn(col: Column): Column = { regexp_replace( regexp_replace(col, "<[^>]+>", ""), " ", " " ).alias(col.toString()) } // 批量处理Answer开头列的入口函数 def cleanAnswerColumns(df: DataFrame): DataFrame = { val answerCols = df.columns.filter(_.startsWith("Answer")) answerCols.foldLeft(df) { (accDf, colName) => accDf.withColumn(colName, cleanHtmlColumn(col(colName))) } } // 调用示例 // val originalCsvDf = spark.read.option("header", "true").csv("your-csv-file-path.csv") // val cleanedResultDf = cleanAnswerColumns(originalCsvDf) // cleanedResultDf.show()
补充说明
如果你的HTML内容特别复杂(比如嵌套标签、脚本块),可以考虑用专业的HTML解析库如jsoup,但在Spark集群环境中需要注意打包依赖;普通场景下,上面的正则方案已经足够应对大部分清洗需求。
内容的提问来源于stack exchange,提问作者balaji mudaliyar
相关产品推荐
相关产品推荐

