Spark解析JSON文件,写入hdfs

一、用Sparkcontext读入文件,map逐行用Gson解析,输出转成一个caseclass类,填充各字段,输出。

解析JSON这里没有什么问题。

RDD覆盖写的时候碰到了一些问题 :

1.直接saveAsTextFile没有覆盖true参数;

2.转dataframe时,还得一个一个字段显化才能转成dataframe;

3.write时,一开始打算写text,说字段里不能含有long和int,换成string后,说不能有多个字段,只能有一个string。刚好用parquet存储省空间,就存parquet了。

跑通代码如下:

复制代码
package XXX

import com.google.gson.JsonParser
import org.apache.spark.sql.SparkSession
import schema.caseClass1

object ParsecaseClass1Json {
  def main(args: Array[String]): Unit = {
    val inputPath = args(0)
    val outputPath = args(1)
    val sparkSession = SparkSession.builder().appName(this.getClass.getSimpleName).getOrCreate()
    import sparkSession.implicits._

    val lines = sparkSession.sparkContext.textFile(inputPath)
    val result = lines.map(=> parseJsonStr(str))

    val df = result.map(
      x => (
        x.adId
        , x.campaignId
        , x.settlementType
        , x.billingType
        , x.billingTypeCode
        , x.packageName
      ))
      .toDF()
    df.coalesce(1).write.format("parquet").mode("overwrite").save(outputPath)

  }

  def parseJsonStr(str: String): caseClass1 = {
      val inputJson = new JsonParser().parse(str).getAsJsonObject
      val object = new caseClass1

      //1.campaignId
      if (inputJson.has("campaign")) {
        val campaign = inputJson.getAsJsonObject("campaign")
        var campaignId: Long = 0
        if (campaign.has("id"))
          campaignId = campaign.getAsJsonPrimitive("id").getAsLong
        else if (campaign.has("campaignId")) {
          campaignId = campaign.getAsJsonPrimitive("campaignId").getAsLong
        }
        else {
          System.err.println("No campaignId, inputJson: {}", str)
        }
        object.campaignId = campaignId
      }

      //2.creativeId
      if (inputJson.has("creative")) {
        val creative = inputJson.getAsJsonObject("creative")
        var adId: Long = 0
        if (creative.has("id"))
          adId = creative.getAsJsonPrimitive("id").getAsLong
        else if (creative.has("creativeId"))
          adId = creative.getAsJsonPrimitive("creativeId").getAsLong
        else
          System.err.println("No adId, inputJson: {}", str)
        object.adId = adId

      }

      /*
      3.settlementType
      4.billingType
      5.billingTypeCode
      6.appId -> packageName
      */
      if (inputJson.has("group")) {
        val group = inputJson.getAsJsonObject("group")

        object.settlementType = group.getAsJsonPrimitive("settlementType").getAsString
        object.billingType = group.getAsJsonPrimitive("billingType").getAsString
        object.billingTypeCode = group.getAsJsonPrimitive("billingTypeCode").getAsInt
        object.packageName = group.getAsJsonPrimitive("appId").getAsString
      }
    System.err.println(object.toString)
    object
  }

}

caseClass如下

复制代码
package XXX;

import java.io.Serializable;

public class caseClass1 implements Serializable {

    private static final long serialVersionUID = ***;

    public long adId = 0;
    public long campaignId = 0;
    public String settlementType;
    public String billingType;
    public Integer billingTypeCode;
    public String packageName;

    @Override
    public String toString() {
        return "caseClass1{" +
                "adId=" + adId +
                ", campaignId=" + campaignId +
                ", settlementType='" + settlementType + '\'' +
                ", billingType='" + billingType + '\'' +
                ", billingTypeCode=" + billingTypeCode +
                ", packageName='" + packageName + '\'' +
                '}';
    }
    public caseClass1() {

    }
}
相关推荐
C_心欲无痕10 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
REDcker20 小时前
AIGCJson 库解析行为与异常处理指南
c++·json·aigc·c
全栈前端老曹21 小时前
【包管理】read-pkg-up 快速上手教程 - 读取最近的 package.json 文件
前端·javascript·npm·node.js·json·nrm·package.json
半熟的皮皮虾1 天前
又重新写了个PDF工具箱-转换office格式/合并/拆分/删除常见操作都有了
python·程序人生·pdf·flask·开源·json·学习方法
Light601 天前
从“报告”到“能力”——构建智能化、可审计的数据治理闭环——领码 SPARK 数据质量平台白皮书
大数据·分布式·spark
我的golang之路果然有问题1 天前
python中 unicorn 热重启问题和 debug 的 json
java·服务器·前端·python·json
火龙谷1 天前
day2-采集数据
spark
kupeThinkPoem2 天前
QJsonObject能否嵌套查找?
qt·json
BD_Marathon2 天前
SpringMVC——json数据传递参数
json
程序员欣宸2 天前
LangChain4j实战之十二:结构化输出之三,json模式
java·人工智能·ai·json·langchain4j