当前位置: 首页 > 知识库问答 >
问题:

用逗号拆分Dataset上的字符串列并获取新的Dataset

房唯
2023-03-14

我正在使用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|...
+-----+--------------+--------------------------+

但是,我想将商店模式拆分为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,但是调用()方法不返回行。< code >发货模式将是动态的,即CSV可能包含一种或两种发货模式。

谢谢。

共有2个答案

夏侯宏旷
2023-03-14

我们可以:

    < li >定义一个用户定义的函数(UDF ),仅执行一次拆分操作 < li >使用选择表达式将拆分的列映射到两个新列中

例如:

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")
濮丁雷
2023-03-14

您可以使用 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: 但是返回的数组是: 有任何想法吗? 问题答案: 正则表达式 意思是“匹配不是反斜杠后跟逗号的字符”-这就是为什么模式之所以匹配

  • 问题内容: 我正在尝试执行类似以下的拆分: 输出: 我要执行此拆分: 但我看到: 有什么办法可以摆脱括号吗?任何帮助表示赞赏。 问题答案: