Java 使用逗号拆分数据集上的字符串列,并获取新数据集
我正在使用Spark2.0开发SparkSQL,并使用JavaAPI读取CSV 在CSV文件中有一个双引号、逗号分隔的列。例:航空快件、送货卡车 读取CSV并返回数据集的代码:Java 使用逗号拆分数据集上的字符串列,并获取新数据集,java,apache-spark,apache-spark-sql,spark-dataframe,Java,Apache Spark,Apache Spark Sql,Spark Dataframe,我正在使用Spark2.0开发SparkSQL,并使用JavaAPI读取CSV 在CSV文件中有一个双引号、逗号分隔的列。例:航空快件、送货卡车 读取CSV并返回数据集的代码: Dataset<Row> df = spark.read() .format("com.databricks.spark.csv") .option("inferSchema", "true") .option("
Dataset<Row> df = spark.read()
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("header", "true")
.load(filename)
但是,我想将车间模式拆分为Mode1和Mode2列,并作为数据集返回
+-----+--------------+--------------+---------------+
|Year | State | Mode1 | Mode2 |...
+-----+--------------+--------------+---------------+
|2012 |New York |Express Air |Delivery Truck |...
|2013 |Nevada |Delivery Truck|null |...
|2013 |North Carolina|Regular Air |Delivery Truck |...
+-----+--------------+--------------+---------------+
有什么方法可以使用Java Spark做到这一点吗
我尝试使用MapFunction,但调用方法时没有返回行。
装运模式将是动态的,即CSV可能包含一种或两种装运模式
谢谢。您可以使用selectExpr,它是select的一个变体,接受SQL表达式,如下所示:
df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");
结果是一个行的数据集。您可以使用selectExpr,它是select的一个变体,接受SQL表达式,如下所示:
df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");
结果是一个行的数据集。我们可以:
定义一个用户定义的函数UDF,以便只执行一次拆分操作
使用select表达式将拆分的列映射为两个新列
例如:
我们可以:
定义一个用户定义的函数UDF,以便只执行一次拆分操作
使用select表达式将拆分的列映射为两个新列
例如:
当逗号分隔值的数量未知时,您能否建议另一种解决方案?它可能会从col1、col2……变化,。。。。到col40。最大值为40。当逗号分隔值的数量未知时,您能建议另一种解决方案吗?它可能会从col1、col2……变化,。。。。到col40。最大值为40。
import org.apache.spark.sql.functions._
import org.apache.spark.sql.{Column, Row}
val splitter = udf((str: String) => {
val splitted = str.split(",").lift
Array(splitted(0), splitted(1))
})
val dfShipMode = df.select($"year",$"state", splitter($"shipMode") as "modes")
.select($"year", $"state", $"modes"(0) as "mode1", $"modes"(1) as "mode2")