Объединение дубликатов столбцов в seq json hdfs файлах в spark - PullRequest
0 голосов
/ 19 января 2019

Я читаю файл seq json из HDFS, используя искру, как это:

val data = spark.read.json(spark.sparkContext.sequenceFile[String, String]("/prod/data/class1/20190114/2019011413/class2/part-*").map{
    case (x,y) => 
    (y.toString)})

data.registerTempTable("data")

val filteredData = data.filter("sourceInfo='Web'")

val explodedData = filteredData.withColumn("A", explode(filteredData("payload.adCsm.vfrd")))
val explodedDataDbg = explodedData.withColumn("B", explode(filteredData("payload.adCsm.dbg"))).drop("payload")

На котором я получаю эту ошибку:

org.apache.spark.sql.AnalysisException: 
Ambiguous reference to fields StructField(adCsm,ArrayType(StructType(StructField(atfComp,StringType,true), StructField(csmTot,StringType,true), StructField(dbc,ArrayType(LongType,true),true), StructField(dbcx,LongType,true), StructField(dbg,StringType,true), StructField(dbv,LongType,true), StructField(fv,LongType,true), StructField(hdr,LongType,true), StructField(hidden,StructType(StructField(duration,LongType,true), StructField(stime,StringType,true)),true), StructField(hvrx,DoubleType,true), StructField(hvry,DoubleType,true), StructField(inf,StringType,true), StructField(isP,LongType,true), StructField(ltav,StringType,true), StructField(ltdb,StringType,true), StructField(ltdm,StringType,true), StructField(lteu,StringType,true), StructField(ltfm,StringType,true), StructField(ltfs,StringType,true), StructField(lths,StringType,true), StructField(ltpm,StringType,true), StructField(ltpq,StringType,true), StructField(ltts,StringType,true), StructField(ltut,StringType,true), StructField(ltvd,StringType,true), StructField(ltvv,StringType,true), StructField(msg,StringType,true), StructField(nl,LongType,true), StructField(prerender,StructType(StructField(duration,LongType,true), StructField(stime,LongType,true)),true), StructField(pt,StringType,true), StructField(src,StringType,true), StructField(states,StringType,true), StructField(tdr,StringType,true), StructField(tld,StringType,true), StructField(trusted,BooleanType,true), StructField(tsc,LongType,true), StructField(tsd,DoubleType,true), StructField(tsz,DoubleType,true), StructField(type,StringType,true), StructField(unloaded,StructType(StructField(duration,LongType,true), StructField(stime,LongType,true)),true), StructField(vdr,StringType,true), StructField(vfrd,LongType,true), StructField(visible,StructType(StructField(duration,LongType,true), StructField(stime,StringType,true)),true), StructField(xpath,StringType,true)),true),true), StructField(adcsm,ArrayType(StructType(StructField(tdr,DoubleType,true), StructField(vdr,DoubleType,true)),true),true);

Не уверен, как, но ТОЛЬКО НЕКОТОРЫЕвнутри "полезной нагрузки" есть две структуры с одинаковым именем "adCsm".Поскольку меня интересуют поля, присутствующие в одном из них, мне нужно разобраться с этой неоднозначностью.

Я знаю, что один из способов - проверить наличие полей A и B и удалить столбец, если поля отсутствуют и, следовательно,выберите другой adCsm.Интересно, есть ли лучший способ справиться с этим?Если я могу просто объединить дубликаты столбцов (с разными данными) вместо этой явной фильтрации?Не уверен, что дубликаты структуры даже присутствуют в файле seq "json" TIA!

1 Ответ

0 голосов
/ 21 января 2019

Я думаю, что двусмысленность произошла из-за проблемы чувствительности к регистру в имени столбца искрового фрейма. В последней части схемы я вижу

StructField(adcsm,
ArrayType(StructType(
StructField(tdr,DoubleType,true), 
StructField(vdr,DoubleType,true)),true),true)

Итак, внутри plain StructType есть два одинаковых имени structFields (adScm и adscm). Сначала включите чувствительность к регистру искры sql

sqlContext.sql("set spark.sql.caseSensitive=true")

тогда он будет различать два поля. Вот детали, чтобы решить чувствительную к регистру проблему решить чувствительную к регистру проблему . Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...