【问题标题】:Matching Column name from Csv file in spark scalaspark scala中Csv文件的匹配列名
【发布时间】:2020-04-22 07:49:40
【问题描述】:

我想从我的 csv 文件中获取标题(列名),并希望与我现有的标题相匹配。 我正在使用以下代码:

val cc = sparksession.read.csv(filepath).take(1)

它给我的价值如下:

Array([id,name,salary]) 

我又创建了一个静态模式,它给了我这样的价值:

val ss=Array("id","name","salary")

然后我尝试使用 if 条件比较列名:

if(cc==ss){
  println("matched")
} else{
  println("not matched")
}

我猜由于[]() 不匹配,它总是会转到其他部分,有没有其他方法可以在不考虑[]() 的情况下比较这些值?

【问题讨论】:

  • 尝试使用 a.deep == b.deep 进行深度比较
  • 您是否只想比较列名或其值?

标签: scala csv apache-spark


【解决方案1】:

首先,为方便起见,在读取文件时将header选项设置为true:

val df = sparksession.read.option("header", true).csv(filepath)

获取列名并定义预期的列名:

val cc = df.columns
val ss = Array("id", "name", "salary")

检查两者是否匹配(不考虑排序):

if (cc.toSet == ss.toSet) {
  println("matched")
} else {
  println("not matched")
}

如果顺序相关,那么条件可以如下做(你不能在这里使用Array,但是Seq可以):

cc.toSeq == ss.toSeq

或者你一个深度数组比较:

cc.deep == d.deep

【讨论】:

    【解决方案2】:

    首先,我认为您正在尝试将Array[org.apache.spark.sql.Row]Array[String] 进行比较。我相信您应该将加载标题的方式更改为:val cc = spark.read.format("csv").option("header", "true").load(fileName).columns.toArray。 然后您可以使用 cc.deep == ss.deep 进行比较。

    【讨论】:

    • val cc= spark.read.csv("filepath").take(1)(0).toString 然后在应用 if 条件后将 ss 创建为 ("","")。也会尝试你的解决方案。谢谢!!
    【解决方案3】:

    下面的代码对我有用。

    val cc= spark.read.csv("filepath").take(1)(0).toString
    

    上面的代码输出为 String:[id,name,salary]。

    创建了一个将架构描述为

    val ss="[id,name,salary]"
    

    然后写了 if else 条件。

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2020-05-14
      • 2017-06-26
      • 2019-05-26
      • 2015-12-16
      • 1970-01-01
      • 2023-04-04
      • 2016-03-06
      • 2014-03-18
      相关资源
      最近更新 更多