使用Spark SQL的多层嵌套Json

时间:2018-09-05 07:33:22

标签: json apache-spark-sql

我有一个特殊要求,即使用Spark SQL转换嵌套json中的一些相关表数据,如下所示。我已经用Scala实现了它,但没有在Spark SQL中解决它。

{
   “ REPORTING_CARRIER”:“ 9E”,    “ DISTANCE”:“ 3132”,    “ ORIGIN_STATE_NM”:“宾夕法尼亚州”,    “ QUARTER”:“ 2”,    “ YEAR”:“ 2017”,    “ ITIN_GEO_TYPE”:“ 2”,    “ BULK_FARE”:“ 0”,    “ ORIGIN”:“ ABE”,    “ ORIGIN_AIRPORT_ID”:“ 10135”,    “ ITIN_FARE”:“ 787”,    “ ORIGIN_CITY_MARKET_ID”:“ 30135”,    “ ROUNDTRIP”:“ 1”,    “市场”:[
      {
         “ MKT_DISTANCE”:“ 1566”,          “ MKT_BULK_FARE”:“ 0”,          “ MKT_NO_OF_CPNS”:“ 2”,          “ MKT_DEST_STATE_NM”:“得克萨斯州”,          “ MKT_OP_CARR_GRP”:“ 9E:DL”,          “ MKT_TK_CARR_GRP”:“ DL:DL”,          “ MKT_MILES_FLOWN”:“ 1566”,          “ MKT_AIRPORT_GROUP”:“ ABE:ATL:SAT”,          “ MKT_FARE_AMT”:“ 393.5”,          “ MKT_ORIG_STATE_NM”:“宾夕法尼亚州”,          “ MKT_DEST_ARPT_CITY_NM”:“ 33214”,          “ MKT_RPTG_CARR_NM”:“ 9E”,          “ MKT_DEST”:“ SAT”,          “ MKT_DEST_CNTRY”:“美国”,          “ MKT_ORIG_CNTRY”:“美国”,          “优惠券”:[
            {
               “ CPN_STATE_NM”:“乔治亚州”,                “ CPN_DEST”:“ ATL”,                “ CPN_TKT_CARR_NM”:“ DL”,                “ TRIP_BREAK”:“”,                “ CPN_MKT_ORIG_ARPT_NM”:“ 10135”,                “ CLASS_OF_SVC”:“ X”,                “ CPN_TKT_NBR”:“ 2017245”,                “ CPN_DEST_CITY_MKT_NM”:“ 30397”,                “ CPN_DISTANCE”:“ 692”,                “ SEQ_NUM”:“ 1”,                “ ITIN_GEO_TYPE”:“ 2”,                “ CPN_RPTG_CARR_NM”:“ 9E”,                “ COUPON_GEO_TYPE”:“ 2”,                “ CPN_ORIG_STATE_NM”:“宾夕法尼亚州”,                “ CPN_OPERG_CARR_NM”:“ 9E”,                “ CPN_ORIG”:“ ABE”,                “ CPN_PASSENGERS”:“ 1”,                “ COUPON_TYPE”:“ A”,                “ CPN_DEST_ARPT_NM”:“ 10397”,                “ CPN_MKT_ORIG_CITY_NM”:“ 30135”,                “ CPN_DEST_CNTRY”:“美国”,                “ CPN_MKT_ID”:“ 201724501”,                “ CPN_ORIG_CNTRY”:“美国”             },             {
               “ CPN_STATE_NM”:“得克萨斯州”,                “ CPN_DEST”:“ SAT”,                “ CPN_TKT_CARR_NM”:“ DL”,                “ TRIP_BREAK”:“ X”,                “ CPN_MKT_ORIG_ARPT_NM”:“ 10397”,                “ CLASS_OF_SVC”:“ X”,                “ CPN_TKT_NBR”:“ 2017245”,                “ CPN_DEST_CITY_MKT_NM”:“ 33214”,                “ CPN_DISTANCE”:“ 874”,                “ SEQ_NUM”:“ 2”,                “ ITIN_GEO_TYPE”:“ 2”,                “ CPN_RPTG_CARR_NM”:“ 9E”,                “ COUPON_GEO_TYPE”:“ 2”,                “ CPN_ORIG_STATE_NM”:“乔治亚州”,                “ CPN_OPERG_CARR_NM”:“ DL”,                “ CPN_ORIG”:“ ATL”,                “ CPN_PASSENGERS”:“ 1”,                “ COUPON_TYPE”:“ A”,                “ CPN_DEST_ARPT_NM”:“ 14683”,                “ CPN_MKT_ORIG_CITY_NM”:“ 30397”,                “ CPN_DEST_CNTRY”:“美国”,                “ CPN_MKT_ID”:“ 201724501”,                “ CPN_ORIG_CNTRY”:“美国”             }          ],          “ MKT_ITIN_ID”:“ 2017245”,          “ MKT_OPERG_CARR_NM”:“ 99”,          “ MKT_DEST_ARPT_NM”:“ 14683”,          “ MKT_ORIG_ARPT_NM”:“ ABE”,          “ MKT_ITIN_GEO_TYPE”:“ 2”,          “ MKT_PASSENGERS”:“ 1”,          “ MKT_ID”:“ 201724501”,          “ MKT_TKT_CARR_NM”:“ DL”       },       {
         “ MKT_DISTANCE”:“ 1566”,          “ MKT_BULK_FARE”:“ 0”,          “ MKT_NO_OF_CPNS”:“ 2”,          “ MKT_DEST_STATE_NM”:“宾夕法尼亚州”,          “ MKT_OP_CARR_GRP”:“ DL:DL”,          “ MKT_TK_CARR_GRP”:“ DL:DL”,          “ MKT_MILES_FLOWN”:“ 1566”,          “ MKT_AIRPORT_GROUP”:“ SAT:ATL:ABE”,          “ MKT_FARE_AMT”:“ 393.5”,          “ MKT_ORIG_STATE_NM”:“得克萨斯州”,          “ MKT_DEST_ARPT_CITY_NM”:“ 30135”,          “ MKT_RPTG_CARR_NM”:“ 9E”,          “ MKT_DEST”:“ ABE”,          “ MKT_DEST_CNTRY”:“美国”,          “ MKT_ORIG_CNTRY”:“美国”,          “优惠券”:[
            {
               “ CPN_STATE_NM”:“乔治亚州”,                “ CPN_DEST”:“ ATL”,                “ CPN_TKT_CARR_NM”:“ DL”,                “ TRIP_BREAK”:“”,                “ CPN_MKT_ORIG_ARPT_NM”:“ 14683”,                “ CLASS_OF_SVC”:“ X”,                “ CPN_TKT_NBR”:“ 2017245”,                “ CPN_DEST_CITY_MKT_NM”:“ 30397”,                “ CPN_DISTANCE”:“ 874”,                “ SEQ_NUM”:“ 3”,                “ ITIN_GEO_TYPE”:“ 2”,                “ CPN_RPTG_CARR_NM”:“ 9E”,                “ COUPON_GEO_TYPE”:“ 2”,                “ CPN_ORIG_STATE_NM”:“得克萨斯州”,                “ CPN_OPERG_CARR_NM”:“ DL”,                “ CPN_ORIG”:“ SAT”,                “ CPN_PASSENGERS”:“ 1”,                “ COUPON_TYPE”:“ A”,                “ CPN_DEST_ARPT_NM”:“ 10397”,                “ CPN_MKT_ORIG_CITY_NM”:“ 33214”,                “ CPN_DEST_CNTRY”:“美国”,                “ CPN_MKT_ID”:“ 201724503”,                “ CPN_ORIG_CNTRY”:“美国”             },             {
               “ CPN_STATE_NM”:“宾夕法尼亚州”,                “ CPN_DEST”:“ ABE”,                “ CPN_TKT_CARR_NM”:“ DL”,                “ TRIP_BREAK”:“ X”,                “ CPN_MKT_ORIG_ARPT_NM”:“ 10397”,                “ CLASS_OF_SVC”:“ X”,                “ CPN_TKT_NBR”:“ 2017245”,                “ CPN_DEST_CITY_MKT_NM”:“ 30135”,                “ CPN_DISTANCE”:“ 692”,                “ SEQ_NUM”:“ 4”,                “ ITIN_GEO_TYPE”:“ 2”,                “ CPN_RPTG_CARR_NM”:“ 9E”,                “ COUPON_GEO_TYPE”:“ 2”,                “ CPN_ORIG_STATE_NM”:“乔治亚州”,                “ CPN_OPERG_CARR_NM”:“ DL”,                “ CPN_ORIG”:“ ATL”,                “ CPN_PASSENGERS”:“ 1”,                “ COUPON_TYPE”:“ A”,                “ CPN_DEST_ARPT_NM”:“ 10135”,                “ CPN_MKT_ORIG_CITY_NM”:“ 30397”,                “ CPN_DEST_CNTRY”:“美国”,                “ CPN_MKT_ID”:“ 201724503”,                “ CPN_ORIG_CNTRY”:“美国”             }          ],          “ MKT_ITIN_ID”:“ 2017245”,          “ MKT_OPERG_CARR_NM”:“ DL”,          “ MKT_DEST_ARPT_NM”:“ 10135”,          “ MKT_ORIG_ARPT_NM”:“ SAT”,          “ MKT_ITIN_GEO_TYPE”:“ 2”,          “ MKT_PASSENGERS”:“ 1”,          “ MKT_ID”:“ 201724503”,          “ MKT_TKT_CARR_NM”:“ DL”       }    ],    “ NO_OF_CPNS”:“ 4”,    “ ORIGIN_COUNTRY”:“ US”,    “ ITIN_ID”:“ 2017245”,    “ PASSENGERS”:“ 1”,    “ MILES_FLOWN”:“ 3132” }

1 个答案:

答案 0 :(得分:0)

您可以在select()数据集API调用中使用from_json()帮助函数,以将JSON字符串中的数据属性和值从JSON字符串提取或解码到DataFrame中,由模式决定。

示例,给定以下json { "reporting_carrier": "A", "market": { "value": 10 } },存储在rawJsonDf

case class MarketData (reporting_carrier: String, market_json: String)

val jsonSchema = new StructType()
  .add("value", LongType)

rawJsonDf
  .toDf("reporting_carrier","market")
  .as[MarketData]

rawJsonDf
  .select(from_json($"market_json", jsonSchema) as "market")
  .filter($"market.value" > 5)

请参见this great tutorial by databricks for more info