繁体   English   中英

如何替换字符串类型的列中的子字符串?

[英]How to replace substrings in column of type String?

我正在尝试转换以下Scala行(它从字符串中提取数字,并在Scala shell中使用了它):

val df2 = df.withColumn("only digits", regexp_replace(col("original"), "[^\\d]", ""))

到它的Java等效项,而从col("original")返回的org.apache.spark.sql.ColumnString.replaceAll()所需的String类型的转换遇到了问题。

我尝试了以下操作,但未编译( cast仍返回Column )。

import org.apache.spark.sql.Column;
import static org.apache.spark.sql.functions.*;
Dataset<Row> df2 = df.withColumn("new", col("original").cast("string").replaceAll("[^\\d]", ""));

我还查看了Column javadocs和上面导入的静态函数,但没有任何帮助。 谢谢。

我从由col("original")返回的org.apache.spark.sql.Column转换为String.replaceAll()所需的String类型时遇到问题。

不会工作。

您必须使用Column类型,因为它表示一个函数,该函数为该列中的每一行生成值。 Spark类型系统与Java(确切地说是Scala)一样多。

一种且唯一的解决方案是使用function对象(或编写用户定义的函数,也称为UDF)。

使用regexp_replace转换为您的用例。

regexp_replace(列e,字符串模式,字符串替换)用rep替换与regexp匹配的指定字符串值的所有子字符串。

translate(Column src,String matchingString,String replaceString)用replaceString中的字符转换src中的任何字符。

我无话可说,@ Jacek Laskowski非常有解释力,完全专注于您的问题。 尽管如此,为了完整起见,我将提供一个示例来说明如何使用Java完成此操作,以便于理解。

  SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .config("spark.master", "local")
                .getOrCreate();
        JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());


        List<Row> data = Arrays.asList(
                RowFactory.create(1, "Hi I heard about *Spark"),
                RowFactory.create(2, "I wish *Java could use case classes"),
                RowFactory.create(3, "Logistic regression models are neat")
        );
        StructType schema = new StructType(new StructField[]{
                new StructField("label", DataTypes.IntegerType, false, Metadata.empty()),
                new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
        });
        Dataset<Row> sentenceData = spark.createDataFrame(data, schema);
        Dataset<Row> transformedDS=sentenceData.withColumn("Replaced_Sentence", 
                functions.regexp_replace(sentenceData.col("sentence"),"\\*",""));
        transformedDS.show(false);

输出为:

+-----+-----------------------------------+-----------------------------------+
|label|sentence                           |Replaced_Sentence                  |
+-----+-----------------------------------+-----------------------------------+
|1    |Hi I heard about *Spark            |Hi I heard about Spark             |
|2    |I wish *Java could use case classes|I wish Java could use case classes |
|3    |Logistic regression models are neat|Logistic regression models are neat|
+-----+-----------------------------------+-----------------------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM