如何从Json数据创建DataFrame,其中两个字段具有相同的键但是大小写不同?

时间:2018-02-24 11:22:03

标签: json apache-spark apache-spark-sql

如何从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。这种方法很慢。

我尝试了多种方法,但仍然存在同样的问题。

  1. 我尝试重命名列名,但仍有错误

    val modDf = df
     .withColumnRenamed("MCC", "MCC_CAP")
     .withColumnRenamed("MNC", "MNC_CAP")
     .withColumnRenamed("MCCMNC", "MCCMNC_CAP")
    
  2. 使用重命名的列

    创建了另一个DataFrame
    val cols = df.columns.map(line => if (line.startsWith("M"))line.concat("_cap") else line)
    val smallDf = df.toDF(cols: _*)
    
  3. 删除重复的列

     val capCols = df.columns.filter(line => line.startsWith("M"))
     val smallDf = df.drop(capCols: _*)
    

1 个答案:

答案 0 :(得分:2)

您应该使用sparkContext将其作为文本rdd阅读,然后使用sqlContextrdd读作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