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()
image.png
后来网上百度了许多,说的是spark 读取json格式是支持半结构化的数据。
后来我在网上找了个工具https://www.sojson.com/在线json格式转换
将数据压缩成单行模式
再跑一下程序
[{"a":"字符串1","b":2,"c":"","d":null}]
image.png
ok,搞定。
去除null和空字符串
1.去除null空值
ds.na.drop(how="all/any",Seq(指定列名))
演示:
ds.na.drop("any",Seq("a","b")).show()
image.png
2.去除空字符串
这里可以使用ds.where进行筛选出非空字符串的数据
ds.where("c <> ''").show()
image.png
后记:
有需要的朋友可以搜索 微信公众号:【知音库】
同时也是为了鼓励自己,坚持写笔记,希望可以共同进步。
网友评论