我正在使用Spark(2.0)进行SparkSQL,并使用JavaAPI读取CSV。
在CSV文件中,有一个双引号,逗号分隔的列。例如:“快递空运,送货卡车”
读取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|...
+-----+--------------+--------------------------+
但是,我想将商店模式
拆分为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,但是调用()方法不返回行。< code >发货模式将是动态的,即CSV可能包含一种或两种发货模式。
谢谢。
我们可以:
例如:
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")
您可以使用 selectExpr,这是接受 SQL 表达式的 select 变体,如下所示:
df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2");
结果是Row的数据集。
我想拆分一个字符串基于逗号不包括一个在双引号,也如果有任何相邻的逗号,他们应该被视为单独的令牌 我可以使用正则表达式([^\“]*)\” 但如果有相邻的逗号,它就无法正确地标记。字符串示例 输出应该是 请帮忙
在逗号处划分字符串的最佳方法是什么,这样每个单词都可以成为ArrayList的一个元素? 例如:
我有一根下面这样的弦- value1,value2,value3,value4,“value5,1234”,value6,value7,“value8”,value9,“value10,123.23”
问题内容: 欲分割为4的阵列,以利用 这是我的代码: 但是,结果标记是一个空数组:[],而不是 我想要的4数组。 我已经测试过更改一点: 这次的结果标记为。这与我想要的接近,但是我真的不想在拆分之前添加此“ 1”。 问题基本上是,如果它仅包含空元素,它将返回一个空数组。 您能帮助解决问题吗? 问题答案: 您需要使用带有limit参数的重载方法。 从文档(重点是我的): limit参数控制应用图案的
问题内容: 我需要编写一个扩展版本的StringUtils.commaDelimitedListToStringArray函数,该函数具有一个附加参数:转义字符。 所以打电话给我: 应该返回: 我当前的尝试是使用String.split()使用正则表达式拆分String: 但是返回的数组是: 有任何想法吗? 问题答案: 正则表达式 意思是“匹配不是反斜杠后跟逗号的字符”-这就是为什么模式之所以匹配
问题内容: 我正在尝试执行类似以下的拆分: 输出: 我要执行此拆分: 但我看到: 有什么办法可以摆脱括号吗?任何帮助表示赞赏。 问题答案: