首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >火花转储到以柱为结构数组的地板上

火花转储到以柱为结构数组的地板上
EN

Stack Overflow用户
提问于 2020-03-03 10:29:02
回答 1查看 2.6K关注 0票数 0

我需要加载一个csv文件,其中有一个列,有一个结构数组,并将它转储到另一个位置的拼板格式。我的csv文件有两列,A列和B列。B列的数据类型是array<struct<x: bigint, y:bigint>>

我尝试用模式加载csv文件,如下所示:

代码语言:javascript
运行
复制
val schemaB = ArrayType(StructType(Seq(StructField("x",LongType),StructField("y",LongType))))
val schema = new StructType().add("A",StringType).add("B",schemaB)
spark.read.option("sep", "\t").schema(schema).csv(<location>)

然而,这是行不通的。我得到了以下错误:

代码语言:javascript
运行
复制
org.apache.spark.sql.AnalysisException: CSV data source does not support array<struct<x:bigint,y:bigint>&gt; data type.;</struct<x:bigint,y:bigint>

我甚至试着转换成所需的类型,但那不起作用。

这是B列的一个示例:

代码语言:javascript
运行
复制
|B                                                                                                                                                                                                                                                                                                                                                                                                                   |
+---------------------------------------------------------------------------------------------+
|68222:102332,21215:1000,10982:70330,|
|93302:13320,263721:902615,9382:100020,|
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 13:04:16

如果您使用的是最新版本的spark (即2.4+ ),则可以使用2.4+函数。

先以字符串形式读取,split by ","获取列表,再以split ":"获取xy

代码语言:javascript
运行
复制
val schema = new StructType().add("A",StringType).add("B",StringType)
val df = spark.read.option("delimiter", "\t").schema(schema).csv("path to csv")
val splitExpr =  expr("transform(split(B, ','), x -> (split(x, ':')[0] as x, split(x, ':')[1] as y))")

val result = df.select($"A", splitExpr.cast("array<struct<x: long, y:long>>") as "B" )

现在,您可以将其保存在拼板中,如果您使用的是spark的旧版本,那么您需要编写一个udf最终模式:

代码语言:javascript
运行
复制
root
 |-- A: string (nullable = true)
 |-- B: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- x: long (nullable = true)
 |    |    |-- y: long (nullable = true)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60505153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档