如何从Json数据创建DataFrame,其中两个字段具有相同的键但是大写不同。例如,
{"abc1":"some-value", "ABC1":"some-other-value", "abc":"some-value"}
{"abc1":"some-value", "ABC1":"some-other-value", "abc":"some-value1"}
目前,我收到了以下错误,
org.apache.spark.sql.AnalysisException: Reference 'ABC1' is ambiguous.
这就是我创建DataFrame的方式,
val df = sqlContext.read.json(inputPath)
我还尝试先创建RDD,然后读取每一行并更改Json字符串中的键名,然后将RDD转换为Dataframe。这种方法很慢。
我尝试了多种方法,但仍然存在同样的问题。
我尝试重命名列名,但仍有错误
val modDf = df
.withColumnRenamed("MCC", "MCC_CAP")
.withColumnRenamed("MNC", "MNC_CAP")
.withColumnRenamed("MCCMNC", "MCCMNC_CAP")
使用重命名的列
创建了另一个DataFrameval cols = df.columns.map(line => if (line.startsWith("M"))line.concat("_cap") else line)
val smallDf = df.toDF(cols: _*)
删除重复的列
val capCols = df.columns.filter(line => line.startsWith("M"))
val smallDf = df.drop(capCols: _*)
答案 0 :(得分:2)
您应该使用sparkContext
将其作为文本rdd阅读,然后使用sqlContext
将rdd
读作json
sqlContext.read.json(sc.textFile("path to your json file"))
您应该将dataframe
作为
+----------------+-----------+----------+
|ABC1 |abc |abc1 |
+----------------+-----------+----------+
|some-other-value|some-value |some-value|
|some-other-value|some-value1|some-value|
+----------------+-----------+----------+
生成的dataframe
会有缺陷,因为火花数据帧中不允许使用重复的列名称(不区分大小写)
所以我强烈建议在将jsons转换为dataframe之前更改重复的列名称
val rdd = sc.textFile("path to your json file").map(jsonLine => jsonLine.replace("\"ABC1\":", "\"AAA\":"))
sqlContext.read.json(rdd)
现在你应该{/ 1}}为
dataframe