Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用逗号拆分数据集上的字符串列,并获取新数据集_Java_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Java 使用逗号拆分数据集上的字符串列,并获取新数据集

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("

我正在使用Spark2.0开发SparkSQL,并使用JavaAPI读取CSV

在CSV文件中有一个双引号、逗号分隔的列。例:航空快件、送货卡车

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

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")