spark dataframe 解析复杂 json

package com.analysys.bacth.etl.stg

import com.analysys.logger.AnalysysLogger
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.types._
import org.apache.spark.sql.{SparkSession, functions}

object StgDevUserNetInfo extends AnalysysLogger {

  def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.OFF)

    if (args.length < 2) {
      throw new IllegalArgumentException("Need to 2 args!!!")
    }
    val Array(proDate, topicID) = args
    val spark = SparkSession.builder().enableHiveSupport.getOrCreate()
    // 设置spark sql中查询分析器区分大小写(抽取数据时有很多异常字段,必须区分)
    spark.conf.set("spark.sql.caseSensitive", "true")
    spark.conf.set("hive.exec.dynamic.partition", "true")
    spark.conf.set("hive.exec.dynamic.partition.mode", "nonstrict")
    spark.conf.set("orc.compress", "ZLIB")
    // spark.conf.set("hive.exec.compress.output", "true")
    // spark.conf.set("mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec")
    // spark.conf.set("mapred.output.compression.type", "BLOCK")
    process(spark, proDate, topicID)
    spark.sql(s"insert overwrite table stg.stg_dev_user_net_info_d partition(day='${proDate}',source='${topicID}') select DI,DB,DM,SV,SN,OSV,OSN,AVC,coalesce(x.app_key,a.AK),AC,AUI,SPN,SAN,SDKV,APIL,MO,PN,userip,MAC,str_to_map('null:null') as memo,IMSIS,AID,SNR,OUD,DBG,HJK,SIR,EGID,TMPID,IJ,IMEIS,BMAC,RES,SFS,TZ,SA,SL,SH,IR,APN,AN,ST,USM,PTL,CAD,RAD,TP from stg_dev_user_net_info_d a left join dim.dim_app_key_package_info x on a.SPN = x.package_name ")

    spark.stop()

  }

  def process(spark: SparkSession, proDate: String, topicID: String) {

    val testFlag = spark.conf.get("spark.test.flag", "0")

    import spark.implicits._
    var sqlText = "select concat(regexp_replace(source_data,'\\\\}-----',',\"HeaderInfo\":'),'}') from source.source_dev_filter WHERE day=" + proDate + " AND source=" + topicID + " AND status=0  AND get_json_object((split(source_data,'-----\\\\{')[0]),'$.NETInfo') is not null " // AND get_json_object((split(source_data,'-----\\{')[0]),'$.NETInfo') like '[{%'
    if (testFlag.equals("1")) sqlText = sqlText + " limit 1 "
    logger.info(sqlText)
    val netInfoDF = spark.sql(sqlText)
    // 初始化一条数据到rdd中,补充缺失的字段
    // 全量Json Log  val jsonLog = "{\"DevInfo\":{\"OSV\":\"null\",\"OSN\":\"null\",\"IJ\":\"null\",\"EGID\":\"null\",\"OUD\":\"null\",\"AID\":\"null\",\"PN\":\"null\",\"AUI\":\"null\",\"SN\":\"Android\",\"SV\":\"6.0.1\",\"DB\":\"OPPO\",\"DI\":\"863363036038592-null-dc6eadd31f0d0135\",\"DM\":\"OPPO R9s\",\"MAC\":\"6c:5c:14:25:be:ba\",\"SNR\":\"unknown\",\"RES\":\"1080-1920\",\"DPI\":\"480\",\"MO\":\"\",\"MPN\":\"\",\"NOC\":\"\",\"NON\":\"只能拨打紧急呼救电话\",\"IMEIS\":\"863363036038592|863363036038584\",\"IMSIS\":\"\",\"AC\":\"WanDouJia\",\"AK\":\"WanDouJia\",\"AN\":\"device\",\"APIL\":\"23\",\"APN\":\"com.device\",\"SDKV\":\"4.0.1\",\"AVC\":\"1.0|1\",\"AM\":\"49:0C:09:7A:B5:32:68:86:16:9A:D5:93:23:91:E9:EE\",\"AS\":\"F3:B6:5F:F3:EA:CC:3F:12:1F:6B:C0:DC:51:00:9F:8B:8C:FD:60:6C\",\"TMPID\":\"\",\"SIR\":\"1\",\"DBG\":\"0\",\"HJK\":\"0\",\"IR\":\"0\",\"BMAC\":\"6c:5c:14:25:be:ba\",\"BName\":\"OPPO R9s\",\"SFS\":\"1.0\",\"SH\":\"24\",\"SL\":\"zh\",\"SA\":\"CN\",\"TZ\":\"GMT+08:00\",\"SSMN\":[{\"SSN\":\"RPR0521 proximity\",\"SSV\":\"1\",\"SSM\":\"Rohm\",\"SSWUS\":true,\"SSP\":0,\"SSI\":1}],\"ETDM\":{\"BS\":\"0\",\"BH\":\"unknown\",\"BL\":\"0\",\"BSL\":\"0\",\"BP\":\"0\",\"BT\":\"unknown\",\"BTP\":\"0\",\"CM\":\"arm64-v8a:\",\"BI\":\"MMB29M\",\"BD\":\"R9s_11_A.27_180803\",\"BPT\":\"R9s\",\"BDE\":\"R9s\",\"BB\":\"msm8953\",\"BBL\":\"unknown\",\"BHW\":\"qcom\",\"BSA\":\"arm64-v8a,armeabi-v7a,armeabi\",\"BSAS\":\"armeabi-v7a,armeabi\",\"BSASS\":\"arm64-v8a\",\"BTE\":\"user\",\"BTS\":\"dev-keys\",\"BFP\":\"OPPO/R9s/R9s:6.0.1/MMB29M/1528528402:user/release-keys\",\"BRV\":\"Q_V1_P14,Q_V1_P14\",\"BIR\":\"eng.root.20181031.225852\",\"BBO\":\"OPPO/R9s/R9s:6.0.1/MMB29M/1522231161:user/release-keys\",\"BSP\":\"2018-06-05\",\"BSI\":23,\"BPSI\":0,\"BC\":\"REL\",\"IDFA\":\"\"}},\"OCInfo\":[{\"ACT\":\"1487311995660\",\"AOT\":\"1487311999662\",\"NT\":\"4G\",\"APN\":\"com.yuanding.seebaby\",\"AN\":\"掌通家园园丁\",\"AVC\":\"5.2.3|85\",\"ETDM\":{\"ST\":\"2\",\"AT\":\"SA\",\"CT\":\"2\"}},{\"ACT\":\"1487311999660\",\"AOT\":\"1487312001200\",\"NT\":\"WIFI\",\"APN\":\"com.abcpen.weike\",\"AN\":\"掌通家园园丁\",\"AVC\":\"1.0|5\",\"ETDM\":{\"ST\":\"2\",\"AT\":\"SA\",\"CT\":\"2\"}}],\"AppSnapshotInfo\":[{\"APN\":\"com.coloros.backuprestore\",\"AN\":\"备份与恢复\",\"AVC\":\"1.6.5|165\",\"AT\":\"0\",\"AHT\":\"1550410800359\"},{\"APN\":\"com.oppo.camera.facebeauty\",\"AN\":\"极致美颜\",\"AVC\":\"3.0.0_671ef32_181031|4311\",\"AT\":\"1\",\"AHT\":\"1550410800650\"},{\"APN\":\"com.oppo.camera.facebeauty\",\"AN\":\"极致美颜\",\"AVC\":\"3.0.0_671ef32_181031|4311\",\"AT\":\"2\",\"AHT\":\"1550410800650\"}],\"LocationInfo\":[{\"CT\":\"1550410800675\",\"GL\":\"40.073196-116.417301\",\"WifiInfo\":[{\"SSID\":\"HiWiFi_59A120_5G\",\"BSSID\":\"d0:ee:07:59:a1:20\",\"LEVEL\":-82,\"CBT\":\"[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\",\"FQC\":5220},{\"SSID\":\"\",\"BSSID\":\"34:2e:b6:ff:53:d0\",\"LEVEL\":-75,\"CBT\":\"[WPA2-PSK-CCMP][WPS][ESS]\",\"FQC\":5745},{\"SSID\":\"HUAWEI-2UXBCC\",\"BSSID\":\"34:2e:b6:cf:53:d0\",\"LEVEL\":-75,\"CBT\":\"[WPA2-PSK-CCMP][WPS][ESS]\",\"FQC\":5745}],\"BaseStationInfo\":[{\"LAC\":4432,\"CI\":24872,\"LV\":2147483647}]}],\"XXXInfo\":[\"d4bElEWTVOQ0FySUVsUFZ5QXhNeUFySUVsU1VTQXdJQ3NnVTBsU1VTQXdJRDBn\\nT0RrMkNnb2dJRkJKXG5SQ0JRVWlCRFVGVWxJRk1nSUNOVVNGSWdJQ0FnSUZaVFV5QWdJQ0FnVWxO\\nVElGQkRXU0JWU1VRZ0lDQWdJQ0JPWVcxbENqSTVPVGs0XG5JQ0EwSUNBZ05pVWdVeUFnSUNBek5T\\nQXhNakkyTkRNMlN5QWdOekU1TVRaTElDQm1aeUIxTUY5aE1UTXpJQ0JqYjIwdWNXbG9iMjh1XG5a\\nR0ZsYlc5dUNpQXhNVFUzSUNBMElDQWdNeVVnVXlBZ0lERXpOU0F5TmpNeU5qRXlTeUF4TkRrME1E\\nUkxJQ0JtWnlCemVYTjBaVzBnXG5JQ0J6ZVhOMFpXMWZjMlZ5ZG1WeUNqSTVOek0wSUNBMElDQWdN\\naVVnVXlBZ0lDQXhPU0F4Tnpjd05qTTJTeUFnTmpVM09UWkxJQ0JpXG5aeUIxTUY5aE1UUTRJQ0Jq\\nYmk1aGJtRnNlWE41Y3k1a1pXMXZPbTF2Ym1sMGIzSlRaWEoyYVdObENqSTVOell4SUNBd0lDQWdN\\nU1VnXG5VaUFnSUNBZ01TQWdNVFU0TmpoTElDQWdNVFV6TWtzZ0lHSm5JSFV3WDJFeE5EZ2dJSFJ2\\nY0FveU9UWTJOaUFnTlNBZ0lERWxJRk1nXG5JQ0FnTXprZ01qQXhNVGMwTkVzZ0lEYzFNelF3U3lB\\nZ1ptY2dkVEJmWVRFME9DQWdZMjR1WVc1aGJIbHplWE11WkdWdGJ3b2dJRE00XG5OaUFnTUNBZ0lE\\nRWxJRk1nSUNBZ016\"],\"NETInfo\":[{\"AN\":\"支付宝\",\"APN\":\"com.eg.android.AlipayGphone\",\"SINF\":[{\"CONNS\":[{\"CAD\":\"192.168.6.199:47178\",\"PTL\":\"tcp\",\"RAD\":\"110.76.15.39:443\",\"TP\":\"ESTABLISHED\"},{\"CAD\":\"::FFFF:0:192.168.6.199\\\\48896\",\"PTL\":\"tcp6\",\"RAD\":\"::FFFF:0:110.75.134.5\\\\443\",\"TP\":\"CLOSE_WAIT\"},{\"CAD\":\"192.168.6.199:45817\",\"PTL\":\"udp\",\"RAD\":\"203.209.245.101:443\",\"TP\":\"ESTABLISHED\"}],\"ST\":1573726492324,\"USM\":\"com.device\"}]}],\"HeaderInfo\":{\"userip\":\"39.177.105.95\",\"AK\":\"8752144198607958d\",\"SDKV\":\"4.3.0.4|20191015\",\"OSV\": \"\",\"tmpid\":\"\",\"egid\":\"\",\"time\": \"1591005283727\",\"debug\": \"0\"}}"
    // 初始化一条默认的Json 获取标准schema
    val jsonLog = "{\"DevInfo\":{\"OSV\":\"null\",\"OSN\":\"null\",\"IJ\":\"null\",\"EGID\":\"null\",\"OUD\":\"null\",\"AID\":\"null\",\"PN\":\"null\",\"AUI\":\"null\",\"SN\":\"Android\",\"SV\":\"6.0.1\",\"DB\":\"OPPO\",\"DI\":\"863363036038592-null-dc6eadd31f0d0135\",\"DM\":\"OPPO R9s\",\"MAC\":\"6c:5c:14:25:be:ba\",\"SNR\":\"unknown\",\"RES\":\"1080-1920\",\"DPI\":\"480\",\"MO\":\"\",\"MPN\":\"\",\"NOC\":\"\",\"NON\":\"只能拨打紧急呼救电话\",\"IMEIS\":\"863363036038592|863363036038584\",\"IMSIS\":\"\",\"AC\":\"WanDouJia\",\"AK\":\"WanDouJia\",\"AN\":\"device\",\"APIL\":\"23\",\"APN\":\"com.device\",\"SDKV\":\"4.0.1\",\"AVC\":\"1.0|1\",\"AM\":\"49:0C:09:7A:B5:32:68:86:16:9A:D5:93:23:91:E9:EE\",\"AS\":\"F3:B6:5F:F3:EA:CC:3F:12:1F:6B:C0:DC:51:00:9F:8B:8C:FD:60:6C\",\"TMPID\":\"\",\"SIR\":\"1\",\"DBG\":\"0\",\"HJK\":\"0\",\"IR\":\"0\",\"BMAC\":\"6c:5c:14:25:be:ba\",\"BName\":\"OPPO R9s\",\"SFS\":\"1.0\",\"SH\":\"24\",\"SL\":\"zh\",\"SA\":\"CN\",\"TZ\":\"GMT+08:00\"},\"NETInfo\":[{\"AN\":\"支付宝\",\"APN\":\"com.eg.android.AlipayGphone\",\"SINF\":[{\"CONNS\":[{\"CAD\":\"192.168.6.199:47178\",\"PTL\":\"tcp\",\"RAD\":\"110.76.15.39:443\",\"TP\":\"ESTABLISHED\"},{\"CAD\":\"::FFFF:0:192.168.6.199\\\\48896\",\"PTL\":\"tcp6\",\"RAD\":\"::FFFF:0:110.75.134.5\\\\443\",\"TP\":\"CLOSE_WAIT\"},{\"CAD\":\"192.168.6.199:45817\",\"PTL\":\"udp\",\"RAD\":\"203.209.245.101:443\",\"TP\":\"ESTABLISHED\"}],\"ST\":1573726492324,\"USM\":\"com.device\"}]}],\"HeaderInfo\":{\"userip\":\"39.177.105.95\",\"AK\":\"8752144198607958d\",\"SDKV\":\"4.3.0.4|20191015\",\"OSV\": \"\",\"tmpid\":\"\",\"egid\":\"\",\"time\": \"1591005283727\",\"debug\": \"0\"}}"
    val jsonLogData = Array(jsonLog)
    // parallelize(data, nums)中nums是设置分片数量的,默认情况下spark会自动根据集群情况进行设定的
    val jsonLogDataRDD = spark.sparkContext.parallelize(jsonLogData, 1)
    val jsonLogDataSchema = spark.read.json(jsonLogDataRDD).schema
    jsonLogDataSchema.printTreeString()
    //防止脏数据产生异常,使用标准schema解析
    val netInfoJsonDF = spark.read.schema(jsonLogDataSchema).json(netInfoDF.rdd.map(_.toString()))
    netInfoJsonDF.printSchema
    /**
      * root
      * |-- AppSnapshotInfo: array (nullable = true)
      * |    |-- element: struct (containsNull = true)
      * |    |    |-- AHT: string (nullable = true)
      * |    |    |-- AN: string (nullable = true)
      * |    |    |-- APN: string (nullable = true)
      * |    |    |-- AT: string (nullable = true)
      * |    |    |-- AVC: string (nullable = true)
      * |-- DevInfo: struct (nullable = true)
      * |    |-- AC: string (nullable = true)
      * |    |-- AID: string (nullable = true)
      * |    |-- AK: string (nullable = true)
      * |    |-- AM: string (nullable = true)
      * |    |-- AN: string (nullable = true)
      * |    |-- APIL: string (nullable = true)
      * |    |-- APN: string (nullable = true)
      * |    |-- AS: string (nullable = true)
      * |    |-- AUI: string (nullable = true)
      * |    |-- AVC: string (nullable = true)
      * |    |-- BMAC: string (nullable = true)
      * |    |-- BName: string (nullable = true)
      * |    |-- DB: string (nullable = true)
      * |    |-- DBG: string (nullable = true)
      * |    |-- DI: string (nullable = true)
      * |    |-- DM: string (nullable = true)
      * |    |-- DPI: string (nullable = true)
      * |    |-- EGID: string (nullable = true)
      * |    |-- ETDM: struct (nullable = true)
      * |    |    |-- BB: string (nullable = true)
      * |    |    |-- BBL: string (nullable = true)
      * |    |    |-- BBO: string (nullable = true)
      * |    |    |-- BC: string (nullable = true)
      * |    |    |-- BD: string (nullable = true)
      * |    |    |-- BDE: string (nullable = true)
      * |    |    |-- BFP: string (nullable = true)
      * |    |    |-- BH: string (nullable = true)
      * |    |    |-- BHW: string (nullable = true)
      * |    |    |-- BI: string (nullable = true)
      * |    |    |-- BIR: string (nullable = true)
      * |    |    |-- BL: string (nullable = true)
      * |    |    |-- BP: string (nullable = true)
      * |    |    |-- BPSI: string (nullable = true)
      * |    |    |-- BPT: string (nullable = true)
      * |    |    |-- BRV: string (nullable = true)
      * |    |    |-- BS: string (nullable = true)
      * |    |    |-- BSA: string (nullable = true)
      * |    |    |-- BSAS: string (nullable = true)
      * |    |    |-- BSASS: string (nullable = true)
      * |    |    |-- BSI: string (nullable = true)
      * |    |    |-- BSL: string (nullable = true)
      * |    |    |-- BSP: string (nullable = true)
      * |    |    |-- BT: string (nullable = true)
      * |    |    |-- BTE: string (nullable = true)
      * |    |    |-- BTP: string (nullable = true)
      * |    |    |-- BTS: string (nullable = true)
      * |    |    |-- CM: string (nullable = true)
      * |    |    |-- IDFA: string (nullable = true)
      * |    |-- HJK: string (nullable = true)
      * |    |-- IJ: string (nullable = true)
      * |    |-- IMEIS: string (nullable = true)
      * |    |-- IMSIS: string (nullable = true)
      * |    |-- IR: string (nullable = true)
      * |    |-- MAC: string (nullable = true)
      * |    |-- MO: string (nullable = true)
      * |    |-- MPN: string (nullable = true)
      * |    |-- NOC: string (nullable = true)
      * |    |-- NON: string (nullable = true)
      * |    |-- OSN: string (nullable = true)
      * |    |-- OSV: string (nullable = true)
      * |    |-- OUD: string (nullable = true)
      * |    |-- PN: string (nullable = true)
      * |    |-- RES: string (nullable = true)
      * |    |-- SA: string (nullable = true)
      * |    |-- SDKV: string (nullable = true)
      * |    |-- SFS: string (nullable = true)
      * |    |-- SH: string (nullable = true)
      * |    |-- SIR: string (nullable = true)
      * |    |-- SL: string (nullable = true)
      * |    |-- SN: string (nullable = true)
      * |    |-- SNR: string (nullable = true)
      * |    |-- SSMN: array (nullable = true)
      * |    |    |-- element: struct (containsNull = true)
      * |    |    |    |-- SSI: long (nullable = true)
      * |    |    |    |-- SSM: string (nullable = true)
      * |    |    |    |-- SSN: string (nullable = true)
      * |    |    |    |-- SSP: long (nullable = true)
      * |    |    |    |-- SSV: string (nullable = true)
      * |    |    |    |-- SSWUS: boolean (nullable = true)
      * |    |-- SV: string (nullable = true)
      * |    |-- TMPID: string (nullable = true)
      * |    |-- TZ: string (nullable = true)
      * |-- HeaderInfo: struct (nullable = true)
      * |    |-- AK: string (nullable = true)
      * |    |-- OSV: string (nullable = true)
      * |    |-- SDKV: string (nullable = true)
      * |    |-- debug: string (nullable = true)
      * |    |-- egid: string (nullable = true)
      * |    |-- time: string (nullable = true)
      * |    |-- tmpid: string (nullable = true)
      * |    |-- userip: string (nullable = true)
      * |-- LocationInfo: array (nullable = true)
      * |    |-- element: struct (containsNull = true)
      * |    |    |-- BaseStationInfo: array (nullable = true)
      * |    |    |    |-- element: struct (containsNull = true)
      * |    |    |    |    |-- CI: long (nullable = true)
      * |    |    |    |    |-- LAC: long (nullable = true)
      * |    |    |    |    |-- LV: long (nullable = true)
      * |    |    |-- CT: string (nullable = true)
      * |    |    |-- GL: string (nullable = true)
      * |    |    |-- WifiInfo: array (nullable = true)
      * |    |    |    |-- element: struct (containsNull = true)
      * |    |    |    |    |-- BSSID: string (nullable = true)
      * |    |    |    |    |-- CBT: string (nullable = true)
      * |    |    |    |    |-- FQC: long (nullable = true)
      * |    |    |    |    |-- LEVEL: long (nullable = true)
      * |    |    |    |    |-- SSID: string (nullable = true)
      * |-- NETInfo: array (nullable = true)
      * |    |-- element: struct (containsNull = true)
      * |    |    |-- AN: string (nullable = true)
      * |    |    |-- APN: string (nullable = true)
      * |    |    |-- SINF: array (nullable = true)
      * |    |    |    |-- element: struct (containsNull = true)
      * |    |    |    |    |-- CONNS: array (nullable = true)
      * |    |    |    |    |    |-- element: struct (containsNull = true)
      * |    |    |    |    |    |    |-- CAD: string (nullable = true)
      * |    |    |    |    |    |    |-- PTL: string (nullable = true)
      * |    |    |    |    |    |    |-- RAD: string (nullable = true)
      * |    |    |    |    |    |    |-- TP: string (nullable = true)
      * |    |    |    |    |-- ST: long (nullable = true)
      * |    |    |    |    |-- USM: string (nullable = true)
      * |-- OCInfo: array (nullable = true)
      * |    |-- element: struct (containsNull = true)
      * |    |    |-- ACT: string (nullable = true)
      * |    |    |-- AN: string (nullable = true)
      * |    |    |-- AOT: string (nullable = true)
      * |    |    |-- APN: string (nullable = true)
      * |    |    |-- AVC: string (nullable = true)
      * |    |    |-- ETDM: struct (nullable = true)
      * |    |    |    |-- AT: string (nullable = true)
      * |    |    |    |-- CT: string (nullable = true)
      * |    |    |    |-- ST: string (nullable = true)
      * |    |    |-- NT: string (nullable = true)
      * |-- XXXInfo: array (nullable = true)
      * |    |-- element: string (containsNull = true)
      */
    // flat data
    val net_info = netInfoJsonDF.select($"DevInfo.DI", $"DevInfo.DB", $"DevInfo.DM", $"DevInfo.SV", $"DevInfo.SN", $"DevInfo.OSV", $"DevInfo.OSN", $"DevInfo.AVC", $"DevInfo.AK", $"DevInfo.AC", $"DevInfo.AUI", $"DevInfo.APN".as("SPN"), $"DevInfo.AN".as("SAN"), $"DevInfo.SDKV", $"DevInfo.APIL", $"DevInfo.MO", $"DevInfo.PN", $"HeaderInfo.userip", $"DevInfo.MAC", $"DevInfo.IMSIS", $"DevInfo.AID", $"DevInfo.SNR", $"DevInfo.OUD", $"DevInfo.DBG", $"DevInfo.HJK", $"DevInfo.SIR", $"DevInfo.EGID", $"DevInfo.TMPID", $"DevInfo.IJ", $"DevInfo.IMEIS", $"DevInfo.BMAC", $"DevInfo.RES", $"DevInfo.SFS", $"DevInfo.TZ", $"DevInfo.SA", $"DevInfo.SL", $"DevInfo.SH", $"DevInfo.IR", functions.explode($"NETInfo"))
    val net_info_sinf = net_info.select($"DI", $"DB", $"DM", $"SV", $"SN", $"OSV", $"OSN", $"AVC", $"AK", $"AC", $"AUI", $"SPN", $"SAN", $"SDKV", $"APIL", $"MO", $"PN", $"userip", $"MAC", $"IMSIS", $"AID", $"SNR", $"OUD", $"DBG", $"HJK", $"SIR", $"EGID", $"TMPID", $"IJ", $"IMEIS", $"BMAC", $"RES", $"SFS", $"TZ", $"SA", $"SL", $"SH", $"IR", $"col.APN", $"col.AN", functions.explode($"col.SINF"))
    val net_info_conns = net_info_sinf.select($"DI", $"DB", $"DM", $"SV", $"SN", $"OSV", $"OSN", $"AVC", $"AK", $"AC", $"AUI", $"SPN", $"SAN", $"SDKV", $"APIL", $"MO", $"PN", $"userip", $"MAC", $"IMSIS", $"AID", $"SNR", $"OUD", $"DBG", $"HJK", $"SIR", $"EGID", $"TMPID", $"IJ", $"IMEIS", $"BMAC", $"RES", $"SFS", $"TZ", $"SA", $"SL", $"SH", $"IR", $"APN", $"AN", $"col.ST", $"col.USM", functions.explode($"col.CONNS"))
    val stg_dev_user_net_info_d = net_info_conns.selectExpr("DI", "DB", "DM", "SV", "SN", "OSV", "OSN", "AVC", "AK", "AC", "AUI", "SPN", "SAN", "SDKV", "APIL", "MO", "PN", "userip", "MAC", "IMSIS", "AID", "SNR", "OUD", "DBG", "HJK", "SIR", "EGID", "TMPID", "IJ", "IMEIS", "BMAC", "RES", "SFS", "TZ", "SA", "SL", "SH", "IR", "APN", "AN", "ST", "USM", "col.PTL", "col.CAD", "col.RAD", "col.TP").where("TP in ('ESTABLISHED', 'LISTEN', 'SYN_SENT', 'SYN_RECV')")
    stg_dev_user_net_info_d.createOrReplaceTempView("stg_dev_user_net_info_d")

    if (testFlag.equals("1")) {
      netInfoDF.show
      netInfoJsonDF.show
      stg_dev_user_net_info_d.show
    }

  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值