用逗号拆分 Dataset<Row> 上的字符串列并获取新的 Dataset<Row>
Split String Column on the Dataset<Row> with comma and get new Dataset<Row>
我正在使用 Spark(2.0) 开发 Spark SQL 并使用 Java API 读取 CSV。
CSV 文件中有一个双引号、逗号分隔的列。例如:"Express Air,Delivery Truck"
用于读取 CSV 和 returning 数据集的代码:
Dataset<Row> df = spark.read()
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("header", "true")
.load(filename)
结果:
+-----+--------------+--------------------------+
|Year | State | Ship Mode |...
+-----+--------------+--------------------------+
|2012 |New York |Express Air,Delivery Truck|...
|2013 |Nevada |Delivery Truck |...
|2013 |North Carolina|Regular Air,Delivery Truck|...
+-----+--------------+--------------------------+
但是,我想将 Shop Mode
拆分为 Mode1
和 Mode2
列,并将 return 作为数据集拆分。
+-----+--------------+--------------+---------------+
|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,但 call() 方法没有 returning Row。
Ship Mode
将是动态的,即 CSV 可能包含一种或两种运输模式。
谢谢。
您可以使用 selectExpr,select 的变体,它接受 SQL 表达式,像这样:
df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");
结果是行数据集。
我们可以:
- 定义一个用户定义函数 (UDF) 以仅执行一次拆分操作
- 使用 select 表达式将拆分列映射到两个新列
例如:
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")
我正在使用 Spark(2.0) 开发 Spark SQL 并使用 Java API 读取 CSV。
CSV 文件中有一个双引号、逗号分隔的列。例如:"Express Air,Delivery Truck"
用于读取 CSV 和 returning 数据集的代码:
Dataset<Row> df = spark.read()
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("header", "true")
.load(filename)
结果:
+-----+--------------+--------------------------+
|Year | State | Ship Mode |...
+-----+--------------+--------------------------+
|2012 |New York |Express Air,Delivery Truck|...
|2013 |Nevada |Delivery Truck |...
|2013 |North Carolina|Regular Air,Delivery Truck|...
+-----+--------------+--------------------------+
但是,我想将 Shop Mode
拆分为 Mode1
和 Mode2
列,并将 return 作为数据集拆分。
+-----+--------------+--------------+---------------+
|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,但 call() 方法没有 returning Row。
Ship Mode
将是动态的,即 CSV 可能包含一种或两种运输模式。
谢谢。
您可以使用 selectExpr,select 的变体,它接受 SQL 表达式,像这样:
df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");
结果是行数据集。
我们可以:
- 定义一个用户定义函数 (UDF) 以仅执行一次拆分操作
- 使用 select 表达式将拆分列映射到两个新列
例如:
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")