scala - 从scala中的json字段中获取具有相同名称的列
问题描述
我有一个要求,我必须从 JSON 中的两列中选择一个城市,其中 city 存在键“City”。表中的第一个值出现为空,无法找到可能的解决方案
val jsonString="""{"Zipcode":704,"ZipCodeType":"STANDARD","City":"PARC PARQUE","State":"PR"}"""
val data = Seq((1, jsonString))
import spark.implicits._
val df=data.toDF("id","value")
df.show(false)
import org.apache.spark.sql.types.{StringType, StructType}
val schema = new StructType()
.add("Zipcode", StringType, true)
.add("ZipCodeType", StringType, true)
.add("City", StringType, false)
.add("City", StringType, true)
val df4=df.withColumn("value",from_json(col("value"),schema))
df4.printSchema()
df4.show(false)
val df5=df4.select(col("id"),col("value.*"))
df5.printSchema()
df5.show()
实际结果:
| id|Zipcode|ZipCodeType|City| City|
| 1| 704| STANDARD|null|PARC PARQUE|
预期结果:
| id|Zipcode|ZipCodeType|City| City|
| 1| 704| STANDARD|PARC PARQUE|PARC PARQUE|
解决方案
我认为你在这里过于复杂了你的问题。只需使用 spark 内置函数就可以了。
我建议使用spark.read.json
函数来进行处理。在这里,这就是我所做的。
val jsonStr = """{"Zipcode":704,"ZipCodeType":"STANDARD","City":"PARC PARQUE","State":"PR"}"""
import spark.implicits._
val df = spark.read.json(Seq(jsonStr).toDS) // this function has overloaded implementation as well so that you can also read json files directly from HDFS/S3
// if you do df.printSchema, it wonn't have a duplicate columns
df.printSchema
推荐阅读
- javascript - 如何将具有公共属性的javascript数组合并为一个数组?
- r - rdflib::as_rdf 只识别一些 IRI
- oracle - 在命令窗口中将行大小设置为假脱机
- python - 如何以 csv 格式显示文件名
- sql-server-2016 - SQL Server 从 JSON 中提取第一个数组元素
- node.js - 有没有办法将参数传递给 google bigquery 以在其“IN”函数中使用
- laravel - 如何计算另一个包含外键的表中的行并为每个集合实例循环它?
- python - Python Celery 试图在 docker-compose 中占用一个端口号并产生问题
- asp.net-core - 使用 UserManager 在 Timer 中不起作用
- ms-access - 多个用户可以同时编辑一个 Access 数据库吗?