如何解决Spark:从ColumnA到ColumnB的字符串操作
嗨,我是Spark的新手,我想知道如何进行字符串操作,以便Column1-Column2获得column3。
注意:我的数据在数据框中
所以基本上我有两个不同的列字符串,并且我只想获取存在于column2而不是列1中的字符串,所以我可以将其生成为column3
Column1
SAMPLE_OUT_3_APPLE|BANANA|GUAVA|ORANGE
Column2
SAMPLE_OUT_3_APPLE|BANANA|GUAVA|GRAPES|ORANGE|BERRY
然后Column3应该是...
Column3
GRAPES,BERRY
但对于第1列和第2列,我也想展示
APPLE,BANANA,ORANGE
只需删除SAMPLE_OUT_3
并用逗号定界
解决方法
您可以用“ |”分隔列像下面 导入spark.implicits ._
totalemoji = 0
for i in range(len(data)):
for i in range(1,3):
totalemoji += data[1][i] + data[1][i] + data[1][i]
print(totalemoji)
,
您还可以通过regexp_replace和udf实现您的目的。
- regexp_replace替换“ |”与“,”和“。* 3_”与“”
- udf从column2和column1获取column3的值
val df1 = Seq(("SAMPLE_OUT_3_APPLE|BANANA|GUAVA|ORANGE","SAMPLE_OUT_3_APPLE|BANANA|GUAVA|GRAPES|ORANGE|BERRY")).toDF("column1","column2")
val df2 =df1.columns.foldLeft(df) { (memoDF,colName) =>
memoDF.withColumn(
colName,regexp_replace(regexp_replace(col(colName),"\\|",","),".*3_",""))}
val diff_udf = udf { ( a: String,b: String) => (a.split(",") diff b.split(",")).mkString(",") }
df2.withColumn("column3",diff_udf(col("column2"),col("column1"))).show(false)
输出:
+-------------------------+--------------------------------------+------------+
|column1 |column2 |column3 |
+-------------------------+--------------------------------------+------------+
|APPLE,BANANA,GUAVA,ORANGE|APPLE,GRAPES,ORANGE,BERRY|GRAPES,BERRY|
+-------------------------+--------------------------------------+------------+
,
对于 Spark> = 2.4
您可以使用array_except
import spark.implicits._
val df = Seq(
("SAMPLE_OUT_3_APPLE|BANANA|GUAVA|ORANGE","SAMPLE_OUT_3_APPLE|BANANA|GUAVA|GRAPES|ORANGE|BERRY")
).toDF("column1","column2")
val remove = df.columns.map(column => split(col(column),"3_").getItem(1).as(column))
val resultDF = df.select(remove: _*)
.withColumn("column1",split($"column1","\\|"))
.withColumn("column2",split($"column2","\\|"))
.withColumn("column3",array_except($"column2",$"column1"))
.withColumn("column1",array_except($"column1",$"column3"))
.withColumn("column2",$"column3"))
val convertToString = resultDF.columns.map(column => concat_ws("|",col(column)).as(column))
resultDF.select(convertToString: _*).show(false)
输出:
+-------------------------+-------------------------+------------+
|column1 |column2 |column3 |
+-------------------------+-------------------------+------------+
|APPLE|BANANA|GUAVA|ORANGE|APPLE|BANANA|GUAVA|ORANGE|GRAPES|BERRY|
+-------------------------+-------------------------+------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。