微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 spark 从多行 json 字符串或 JSONL 字符串中创建数据帧

如何解决无法使用 spark 从多行 json 字符串或 JSONL 字符串中创建数据帧

我一直在尝试从 jsonl 字符串中形成数据框。我能够形成数据框,但问题是只有单行被读取,忽略其他。
以下是我在 spark-shell 中尝试的内容

// This one is example multiline json.
val jsonEx = "{\"name\":\"James\"}{\"name\":\"John\"}{\"name\":\"Jane\"}"

// schema for it is 
val sch = new StructType().add("name",StringType)

val ds = Seq(jsonEx).toDS()

// 1st attempt -- using multiline and spark.json
spark.read.option("multiLine",true).schema(sch).json(ds).show
+-----+
| name|
+-----+
|James|
+-----+

// 2nd attempt -- using from_json
ds.withColumn("json",from_json(col("value"),sch)).select("json.*").show
+-----+
| name|
+-----+
|James|
+-----+

//3rd attempt -- using from_json in little different way
ds.select(from_json(col("value"),sch) as "json").select("json.*").show
+-----+
| name|
+-----+
|James|
+-----+

I even tried updating string as,val jsonEx = "{\"name\":\"James\"}\n{\"name\":\"John\"}\n{\"name\":\"Jane\"}"
and 
val jsonEx = "{\"name\":\"James\"}\n\r{\"name\":\"John\"}\n\r{\"name\":\"Jane\"}"

But the result was same.

有人在这里遗漏了什么吗?

如果有人想知道为什么我不从文件而不是字符串中读取。 我在 resources 路径中有一个 jsonl 配置文件。当我尝试使用 getClass.getResource scala 读取它时出现错误,而 getClass.getResourceAsstream 工作并且我能够读取数据。

val configPath = "/com/org/example/data_sources_config.jsonl"
for(line <- Source.fromInputStream(getClass.getResourceAsstream(configPath)).getLines) { print(line)}
{"name":"james"} ...

but when I do,for(line <- Source.fromFile(getClass.getResource(configPath).getPath).getLines) { print(line)}
java.io.FileNotFoundException: file:/Users/sachindoiphode/workspace/dap-links-datalake-jobs/target/dap-links-datalake-jobs-0.0.65.jar!/com/org/example/data_sources_config.jsonl (No such file or directory)

解决方法

即使 jsonEx 是多行 JSON。它仍然是一个元素。您需要从中提取行。

val ds = jsonEx.split("\n").toSeq.toDS

要读取多行 JSON 文件,也许您可​​以尝试这样的操作:

val path = "/com/org/example/data_sources_config.jsonl"
val source = Source.fromFile(getClass.getResource(path).getPath)
val content = source.getLines.mkString

然后执行 content.split().toSq.toDF 如果您想从中创建一个数据框。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。