Scala 我需要比较两个数据帧进行类型验证,并发送一个非零值作为输出
我正在比较两个数据帧(基本上这是两个不同数据源的模式,一个来自hive,另一个来自SAS9.2) 我需要验证两个数据源的结构,因此我将模式转换为两个数据帧,它们如下所示: SAS架构将采用以下格式:Scala 我需要比较两个数据帧进行类型验证,并发送一个非零值作为输出,scala,apache-spark,bigdata,Scala,Apache Spark,Bigdata,我正在比较两个数据帧(基本上这是两个不同数据源的模式,一个来自hive,另一个来自SAS9.2) 我需要验证两个数据源的结构,因此我将模式转换为两个数据帧,它们如下所示: SAS架构将采用以下格式: scala> metadata.show +----+----------------+----+---+-----------+-----------+ |S_No| Variable|Type|Len| Format| Informat| +----+-----
scala> metadata.show
+----+----------------+----+---+-----------+-----------+
|S_No| Variable|Type|Len| Format| Informat|
+----+----------------+----+---+-----------+-----------+
| 1| DATETIME| Num| 8|DATETIME20.|DATETIME20.|
| 2| LOAD_DATETIME| Num| 8|DATETIME20.|DATETIME20.|
| 3| SOURCE_BANK|Char| 1| null| null|
| 4| EMP_NAME|Char| 50| null| null|
| 5|HEADER_ROW_COUNT| Num| 8| null| null|
| 6| EMP_HOURS| Num| 8| 15.2| 15.1|
+----+----------------+----+---+-----------+-----------+
df2.show
+----------------+-------------+
| Variable| type|
+----------------+-------------+
| datetime|TimestampType|
| load_datetime|TimestampType|
| source_bank| StringType|
| emp_name| StringType|
|header_row_count| IntegerType|
| emp_hours| DoubleType|
+----------------+-------------+
类似地,配置单元元数据将采用以下格式:
scala> metadata.show
+----+----------------+----+---+-----------+-----------+
|S_No| Variable|Type|Len| Format| Informat|
+----+----------------+----+---+-----------+-----------+
| 1| DATETIME| Num| 8|DATETIME20.|DATETIME20.|
| 2| LOAD_DATETIME| Num| 8|DATETIME20.|DATETIME20.|
| 3| SOURCE_BANK|Char| 1| null| null|
| 4| EMP_NAME|Char| 50| null| null|
| 5|HEADER_ROW_COUNT| Num| 8| null| null|
| 6| EMP_HOURS| Num| 8| 15.2| 15.1|
+----+----------------+----+---+-----------+-----------+
df2.show
+----------------+-------------+
| Variable| type|
+----------------+-------------+
| datetime|TimestampType|
| load_datetime|TimestampType|
| source_bank| StringType|
| emp_name| StringType|
|header_row_count| IntegerType|
| emp_hours| DoubleType|
+----------------+-------------+
现在,我需要在列类型和验证结构上比较这两者
最后,如果模式验证成功,我需要存储一个非零值作为输出
如何实现这一点?您可以连接两个数据帧,然后通过映射和UDF比较与列类型对应的两列。 这是一个这样做的代码示例。 您需要使用正确的值完成映射
val sqlCtx = sqlContext
import sqlCtx.implicits._
val metadata: DataFrame= Seq(
(Some("1"), "DATETIME", "Num", "8", "DATETIME20", "DATETIME20"),
(Some("3"), "SOURCEBANK", "Num", "1", "null", "null")
).toDF("SNo", "Variable", "Type", "Len", "Format", "Informat")
val metadataAdapted: DataFrame = metadata
.withColumn("Name", functions.upper(col("Variable")))
.withColumnRenamed("Type", "TypeHive")
val sasDF = Seq(("datetime", "TimestampType"),
("datetime", "TimestampType")
).toDF("variable", "type")
val sasDFAdapted = sasDF
.withColumn("Name", functions.upper(col("variable")))
.withColumnRenamed("Type", "TypeSaS")
val res = sasDFAdapted.join(metadataAdapted, Seq("Name"), "inner")
val map = Map("TimestampType" -> "Num")
def udfType(dict: Map[String, String]) = functions.udf( (typeVar: String) => dict(typeVar))
val result = res.withColumn("correctMapping", udfType(map)(col("TypeSaS")) === col("TypeHive"))
你能展示你到目前为止所尝试的吗?最终的数据帧是什么样子的?你可以使用
printSchema
查看两个数据帧的模式,你可以使用df.schema.dataType
获取数据类型并比较它们。你可以将datetime更改为Num。这是一个错误。这只是一些参数。我们的想法是加入dataframe并使用udf比较您的类型列。非常感谢您的回答。但我实际上需要验证配置单元模式是否与s Sas模式相同,所以我需要指出配置单元中的“timestamptype”和Sas中的Datetime是哪个NUm类型,并且配置单元中的Integer类型具有与Sas中的NUm相同的数据类型,所以基本上我还需要将Sas模式中的“Format”列与配置单元模式进行比较。您能考虑一下吗