Как сравнить схему кадра данных, прочитанного из таблицы RDBMS, с той же таблицей в Hive? - PullRequest
0 голосов
/ 03 сентября 2018

Я создал фрейм данных, прочитав таблицу RDBMS из postgres, как показано ниже:

  val yearDF = spark.read.format("jdbc").option("url", connectionUrl)
                         .option("dbtable", s"(${execQuery}) as year2017")
                         .option("user", devUserName)
                         .option("password", devPassword)
                         .option("numPartitions",10)
                         .load()

execQuery содержание: select qtd_balance_text,ytd_balance_text,del_flag,source_system_name,period_year from dbname.hrtable;

Это схема моего окончательного фрейма данных:

println(yearDF.schema)

StructType(StructField(qtd_balance_text,StringType,true), StructField(ytd_balance_text,StringType,true), StructField(del_flag,IntegerType,true), StructField(source_system_name,StringType,true), StructField(period_year,DecimalType(15,0),true))

В Hive есть таблица с таким же именем: hrtable и такими же именами столбцов. Прежде чем вводить данные в таблицу Hive, я хочу проверить код, чтобы убедиться, что схема таблиц GP и Hive одинакова. Мне удалось получить доступ к схеме следующим образом:

spark.sql("desc formatted databasename.hrtable").collect.foreach(println)

Но проблема в том, что он собирает схему другим способом

[  qtd_balance_text,bigint,null]
[  ytd_balance_text,string,null]
[          del_flag,string,null]
[source_system_name,bigint,null]
[       period_year,bigint,null]
[Type,MANAGED,]
[Provider,hive,]
[Table Properties,[orc.stripe.size=536870912, transient_lastDdlTime=1523914516, last_modified_time=1523914516, last_modified_by=username, orc.compress.size=268435456, orc.compress=ZLIB, serialization.null.format=null],]
[Location,hdfs://devenv/apps/hive/warehouse/databasename.db/hrtable,]
[Serde Library,org.apache.hadoop.hive.ql.io.orc.OrcSerde,]
[InputFormat,org.apache.hadoop.hive.ql.io.orc.OrcInputFormat,]
[OutputFormat,org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat,]
[Storage Properties,[serialization.format=1],]
[Partition Provider,Catalog,]

Ясно, что я не могу схемы, которые присутствуют таким образом, и я не мог понять, как это сделать. Может ли кто-нибудь дать мне знать, как правильно сравнить схему dataframe yearDF и таблицу кустов: hrtable?

1 Ответ

0 голосов
/ 04 сентября 2018

Вместо анализа выходных данных схемы таблиц Hive вы можете попробовать эту опцию.

Чтение таблицы Hive также в виде информационного кадра. Предположим, этот фрейм данных df1, а ваш yearDF как df2. Затем сравните схемы, как показано ниже.

Если существует вероятность того, что число столбцов также различается между двумя кадрами данных, то следует также выполнить дополнительный цикл df1.size == df2.size сравнение if.

val x = df1.schema.sortBy(x => x.name) // get dataframe 1 schema and sort it base on column name.
val y = df2.schema.sortBy(x => x.name) // // get dataframe 2 schema and sort it base on column name.

val out = x.zip(y).filter(x => x._1 != x._2) // zipping 1st column of df1, df2 ...2nd column of df1,df2 and so on for all columns and their datatypes. And filtering if any mismatch is there

if(out.size == 0) { // size of `out` should be 0 if matching
    println("matching")
}
else println("not matching")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...