我正在使用Spark(2.0)处理Spark SQL,并使用Java API读取CSV。

在CSV文件中,有一个双引号,逗号分隔的列。例如:"Express Air,Delivery Truck"

读取CSV和返回数据集的代码:

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拆分为Mode1Mode2列,并作为数据集返回。

+-----+--------------+--------------+---------------+
|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()方法未返回Row。
Ship Mode将是动态的,即CSV可能包含一种或两种运送模式。

谢谢。

最佳答案

您可以使用selectExpr,这是select的一种变体,可以接受SQL表达式,如下所示:

df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");


结果是行的数据集。

10-07 19:04
查看更多