Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 我需要比较两个数据帧进行类型验证,并发送一个非零值作为输出_Scala_Apache Spark_Bigdata - Fatal编程技术网

Scala 我需要比较两个数据帧进行类型验证,并发送一个非零值作为输出

Scala 我需要比较两个数据帧进行类型验证,并发送一个非零值作为输出,scala,apache-spark,bigdata,Scala,Apache Spark,Bigdata,我正在比较两个数据帧(基本上这是两个不同数据源的模式,一个来自hive,另一个来自SAS9.2) 我需要验证两个数据源的结构,因此我将模式转换为两个数据帧,它们如下所示: SAS架构将采用以下格式: scala> metadata.show +----+----------------+----+---+-----------+-----------+ |S_No| Variable|Type|Len| Format| Informat| +----+-----

我正在比较两个数据帧(基本上这是两个不同数据源的模式,一个来自hive,另一个来自SAS9.2)

我需要验证两个数据源的结构,因此我将模式转换为两个数据帧,它们如下所示:

SAS架构将采用以下格式:

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”列与配置单元模式进行比较。您能考虑一下吗