scala—如何通过操作数据集列中的一个来从现有数据集创建新的数据集

tp5buhyn  于 2021-05-22  发布在  Spark
关注(0)|答案(1)|浏览(354)

我对spark和scala非常陌生,我试图从现有的数据集a创建一个新的数据集b。
数据集a有a、b、c列—我希望数据集b有a、b和d列。
列d也应该是布尔值 true 或者 false ,具体取决于c列中的值。例如,假设c列是一个字符串-如果字符串大于10个字符,我希望d列为true,如果字符串小于10个字符,则为false。
任何帮助都将不胜感激!!

lqfhib0f

lqfhib0f1#

可以使用withcolumn、length和drop。长度检查将返回布尔类型的列。

import org.apache.spark.sql.functions._
import spark.implicits._

val dataJsonStr="""[{"a":1,"b":1.1,"c":"Morethan10chars"},{"a":2,"b":2.2,"c":"lesthn10"}]"""

val dataSetA = spark.read.json(Seq(dataJsonStr).toDS)
dataSetA.show(false)
+---+---+---------------+
|a  |b  |c              |
+---+---+---------------+
|1  |1.1|Morethan10chars|
|2  |2.2|lesthn10       |
+---+---+---------------+

val dataSetB = dataSetA.withColumn("d", length(col("c")) >= 10).drop("c")

dataSetB.show(false)
+---+---+-----+
|a  |b  |d    |
+---+---+-----+
|1  |1.1|true |
|2  |2.2|false|
+---+---+-----+

dataSetB.printSchema()
root
 |-- a: long (nullable = true)
 |-- b: double (nullable = true)
 |-- d: boolean (nullable = true)

相关问题