SparkSession读取json格式数据和去除null和空字符串问题

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参数介绍:

属性名称默认值含义
primitivesAsStringfalse将所有 原始类型 推断为 字符串类型
prefersDecimalfalse将所有 浮点类型 推断为 decimal 类型,如果不适合,则 推断为 double 类型
allowCommentsfalse忽略JSON记录中的Java / C ++样式注释
allowUnquotedFieldNamesfalse允许不带引号的JSON字段名称
allowSingleQuotestrue除双引号外,还允许使用单引号
allowNumericLeadingZerosfalse允许数字前有零
allowBackslashEscapingAnyCharacterfalse允许反斜杠转义任何字符
allowUnquotedControlCharsfalse允许JSON字符串包含不带引号的控制字符(值小于32的ASCII字符,包括制表符和换行符)或不包含。
modePERMISSIVEPERMISSIVE:允许在解析过程中处理损坏记录; DROPMALFORMED:忽略整个损坏的记录;FAILFAST:遇到损坏的记录时抛出异常。
columnNameOfCorruptRecordcolumnNameOfCorruptRecord(默认值是spark.sql.columnNameOfCorruptRecord中指定的值):允许重命名由PERMISSIVE 模式创建的新字段(存储格式错误的字符串)。这会覆盖spark.sql.columnNameOfCorruptRecord
dateFormatdateFormat(默认yyyy-MM-dd):设置表示日期格式的字符串。自定义日期格式遵循java.text.SimpleDateFormat中的格式。
timestampFormattimestampFormat(默认yyyy-MM-dd’T’HH:mm:ss.SSSXXX):设置表示时间戳格式的字符串。 自定义日期格式遵循java.text.SimpleDateFormat中的格式。
multiLinefalse解析可能跨越多行的一条记录
实例演示

数据源格式: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

后记:

有需要的朋友可以搜索 微信公众号:【知音库
同时也是为了鼓励自己,坚持写笔记,希望可以共同进步。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义一个中间件来实现 ASP.NET Core WebApi 返回统一格式参数的需求,下面是一个简单的实现方式: 1. 首先创建一个类来表示统一的返回格式,如下所示: ``` public class ApiResponse<T> { public int Code { get; set; } public string Message { get; set; } public T Data { get; set; } } ``` 其中,Code 表示返回码,Message 表示返回信息,Data 表示返回数据。 2. 创建一个中间件来处理返回结果,如下所示: ``` public class ApiResponseMiddleware { private readonly RequestDelegate _next; public ApiResponseMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // 执行后续中间件 await _next(context); // 如果返回的是 JsonResult 类型,则对返回结果进行处理 if (context.Response.ContentType == "application/json") { var originalBodyStream = context.Response.Body; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; var jsonSerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; // 读取原始返回结果 var streamReader = new StreamReader(context.Response.Body); var responseBodyText = await streamReader.ReadToEndAsync(); context.Response.Body.Seek(0, SeekOrigin.Begin); // 将原始返回结果反序列化为 ApiResponse 类型 var result = JsonConvert.DeserializeObject<ApiResponse<object>>(responseBodyText, jsonSerializerSettings); // 将 Null 替换为字符串 result.Data = result.Data ?? string.Empty; // 将 ApiResponse 类型序列化为 Json 字符串 var newResponseBody = JsonConvert.SerializeObject(result); // 将处理后的结果写入 Response 中 using (var sw = new StreamWriter(context.Response.Body)) { sw.Write(newResponseBody); } } } } } ``` 3. 在 Startup.cs 文件的 Configure 方法中添加中间件,如下所示: ``` public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 省略其他代码... app.UseMiddleware<ApiResponseMiddleware>(); // 省略其他代码... } ``` 这样就可以实现 ASP.NET Core WebApi 返回统一格式参数的需求,并且将返回结果中的 Null 替换为字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值