Как сопоставить схему двух фреймов данных - PullRequest
0 голосов
/ 13 июня 2019

У меня есть имена столбцов по умолчанию, сохраненные в таблице, и я хочу сопоставить имя столбца, сохраненное в таблице, с именами столбцов, которые я получу в файле CSV.

Результат приведенного ниже кода:

если файл имеет те же имена столбцов, что и сохраненные в таблице для сопоставления, выполните некоторую обработку, иначе выйдите и сгенерируйте сообщение электронной почты о несоответствии схемы.

Вот мой код:

val expectedschemadf = spark.sql(s"""SELECT columnname FROM  table""").columns
val receivedschemadf = spark.table(vendorfile.toString).columns

if(expectedschemadf.size == receivedschemadf.size)
{
  breakable {for(i<-0 to expectedschemadf.size-1 by 1)
  {
    if (!(receivedschemadf contains expectedschemadf(i)))
    {
      print("fail")
      break
    }

  }
  }
}
else(print("fail"))

Результат, который я хочу:

Я хочу автоматизировать вышеприведенный цикл for в какую-то предопределенную функцию или еще.

Ответы [ 3 ]

0 голосов
/ 14 июня 2019

Я не запускал этот код в среде, но обычно так можно получить имена столбцов в seq, и Seq.equals должен возвращать true, если порядок и члены последовательностей одинаковы, и false, если есть какие-либоразличия.

val tableSeq = Seq("name","address","zip") // simulating a seq that you can retrive from your table 
val inputdf = spark.read.json("path") // reading some external data into dataframe
val columnListUnzipped = inputdf.dtypes.unzip // unzip will give tupple of column name and type
val columnList= columnListUnzipped._1 // get all column names as a seq
val isEqual= tableSeq.euqals(columnList) // compare 2 sequences with using equal as provided by Scala
0 голосов
/ 19 июня 2019

Вот как я выполнил свою задачу.

val expectedCol = dfMetaDataFileTracker.select("COLUMNNAME").collect().map(_.getString(0)).sorted.toList.map(_.toUpperCase()) 
val receivedCol = dfVendorFile.columns.sorted.toList.map(_.toUpperCase())
  if ((expectedCol.length == receivedCol.length) && (expectedCol.equals(receivedCol))) 
  {
    println("file schema matched with the expected schema!")
    break
  }
  else {
    println("file schema does not matched with the expected schema!")
    break        
  }
0 голосов
/ 13 июня 2019

Ниже приведен пример кода для проверки схемы двух фреймов данных

scala> val df1 = Seq((1,"a", 1.5)).toDF
df1: org.apache.spark.sql.DataFrame = [_1: int, _2: string ... 1 more field]

scala> df1.printSchema
root
 |-- _1: integer (nullable = false)
 |-- _2: string (nullable = true)
 |-- _3: double (nullable = false)

scala> val df2 = Seq((100,"x", 1231)).toDF
df2: org.apache.spark.sql.DataFrame = [_1: int, _2: string ... 1 more field]

scala> df2.printSchema
root
 |-- _1: integer (nullable = false)
 |-- _2: string (nullable = true)
 |-- _3: integer (nullable = false)


scala> df1.schema == df2.schema
res7: Boolean = false

scala> val df3 = Seq((100,"x", 123.1)).toDF
df3: org.apache.spark.sql.DataFrame = [_1: int, _2: string ... 1 more field]

scala> df3.printSchema
root
 |-- _1: integer (nullable = false)
 |-- _2: string (nullable = true)
 |-- _3: double (nullable = false)


scala> df1.schema == df3.schema
res9: Boolean = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...