1.json 格式 是什么样的?
// 对象形式
{"name":"user","age":12}
// 数组形式
[{"name":"user","age":12},{"name":"user1","age":25}]
// 对象里包数组
{
"s1":["1","2","3","4"],
"s2":["5","6","7","8"]
}
// 数组里包对象
[{"":"user","年龄":12},{"姓名":"user1","年龄":25}]
[参考网址](https://www.jb51.net/article/162984.htm)
spark读取不同文件类型的配置都是不同的 首先先看一下不同格式的option的参数。
option参数介绍:
属性名称 | 默认值 | 含义 |
---|---|---|
primitivesAsString | false | 将所有 原始类型 推断为 字符串类型 |
prefersDecimal | false | 将所有 浮点类型 推断为 decimal 类型,如果不适合,则 推断为 double 类型 |
allowComments | false | 忽略JSON记录中的Java / C ++样式注释 |
allowUnquotedFieldNames | false | 允许不带引号的JSON字段名称 |
allowSingleQuotes | true | 除双引号外,还允许使用单引号 |
allowNumericLeadingZeros | false | 允许数字前有零 |
allowBackslashEscapingAnyCharacter | false | 允许反斜杠转义任何字符 |
allowUnquotedControlChars | false | 允许JSON字符串包含不带引号的控制字符(值小于32的ASCII字符,包括制表符和换行符)或不包含。 |
mode | PERMISSIVE | PERMISSIVE :允许在解析过程中处理损坏记录; DROPMALFORMED :忽略整个损坏的记录;FAILFAST :遇到损坏的记录时抛出异常。 |
columnNameOfCorruptRecord | columnNameOfCorruptRecord (默认值是spark.sql.columnNameOfCorruptRecord中指定的值):允许重命名由PERMISSIVE 模式创建的新字段(存储格式错误的字符串)。这会覆盖spark.sql.columnNameOfCorruptRecord 。 | |
dateFormat | dateFormat (默认yyyy-MM-dd):设置表示日期格式的字符串。自定义日期格式遵循java.text.SimpleDateFormat 中的格式。 | |
timestampFormat | timestampFormat (默认yyyy-MM-dd’T’HH:mm:ss.SSSXXX):设置表示时间戳格式的字符串。 自定义日期格式遵循java.text.SimpleDateFormat 中的格式。 | |
multiLine | false | 解析可能跨越多行的一条记录 |
实例演示
数据源格式:data.json:
[
{
"a":"字符串1",
"b":2,
"c":"",
"d":null
}
]
结果显示结果却都在一列中,这并不是我要的结果:
val spark = SparkSession
.builder()
.config("spark.sql.warehouse.dir","file:///")
.master("local")
.getOrCreate()
val ds = spark.read.format("json")
//将读取的数据全部转换成string数据类型
.option("primitivesAsString","true")
.load("./data.json")
ds.show()
ds.printSchema()
后来网上百度了许多,说的是spark 读取json格式是支持半结构化的数据。
后来我在网上找了个工具https://www.sojson.com/在线json格式转换
将数据压缩成单行模式
再跑一下程序
[{"a":"字符串1","b":2,"c":"","d":null}]
ok,搞定。
###去除null和空字符串
1.去除null空值
ds.na.drop(how="all/any",Seq(指定列名))
演示:
ds.na.drop("any",Seq("a","b")).show()
2.去除空字符串
这里可以使用ds.where进行筛选出非空字符串的数据
ds.where("c <> ''").show()
后记:
有需要的朋友可以搜索 微信公众号:【知音库】
同时也是为了鼓励自己,坚持写笔记,希望可以共同进步。