【问题标题】:How to replace substrings in column of type String?如何替换字符串类型列中的子字符串?
【发布时间】:2017-12-28 00:04:42
【问题描述】:

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

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

到它的 Java 等效项,我在将 col("original") 返回的 org.apache.spark.sql.Column 转换为 String.replaceAll() 所需的字符串类型时遇到问题。

我尝试了以下方法,但无法编译(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]", ""));

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

【问题讨论】:

  • 什么是 Spark 版本?

标签: java apache-spark dataframe apache-spark-sql


【解决方案1】:

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

不会工作。

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

唯一的解决方案是使用 functions 对象(或编写用户定义的函数,即 UDF)。

regexp_replacetranslate 用于您的用例。

regexp_replace(Column e, String pattern, String replacement) 用rep替换指定字符串值的所有匹配regexp的子字符串。

translate(Column src, String matchingString, String replaceString) 将 src 中的任何字符翻译成 replaceString 中的一个字符。

【讨论】:

  • 谢谢,杰克!所以事实证明,Java 代码与 Scala 代码毕竟是相同的。
  • 是的!这是一个简单的答案(而且无法相信你在问这个问题):)
【解决方案2】:

我无话可说,@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|
+-----+-----------------------------------+-----------------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 2021-12-19
    • 2020-04-05
    • 2012-04-03
    • 2013-07-23
    相关资源
    最近更新 更多