我正在尝试转换以下Scala行(从字符串中提取数字以及我在Scala shell中使用的数字):
val df2 = df.withColumn("only digits", regexp_replace(col("original"), "[^\\d]", ""))
到它的Java等价物,我在org.apache.spark.sql.Column
返回的col("original")
转换为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以及上面导入的静态函数但没有看到任何帮助。感谢。
答案 0 :(得分:5)
我遇到
org.apache.spark.sql.Column
返回col("original")
到String
所需的String.replaceAll()
类型转换的问题。
不会工作。
您必须使用Column
类型,因为它表示为该列中的每一行生成值的函数。这与Spark的类型系统一样多(或者Scala是精确的)。
唯一的解决方案是使用functions对象(或编写用户定义的函数,即UDF)。
使用regexp_replace或translate作为用例。
regexp_replace(列e,字符串模式,字符串替换)将与regexp匹配的指定字符串值的所有子字符串替换为rep。
translate(Column src,String matchingString,String replaceString)使用replaceString中的字符翻译src中的任何字符。
答案 1 :(得分:1)
我无话可说,@ 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|
+-----+-----------------------------------+-----------------------------------+