源和接收器中的“验证架构”

问题描述

我正在使用以下数据集来测试“映射数据流”:https://github.com/fivethirtyeight/data/tree/master/avengers

我的数据流非常简单;将源(AzureDataLakeStorageGen2上的分隔文件)移动到接收器(AzureDataLakeStorageGen2上的镶木地板文件)。我已经使用导入投影功能获取我的架构并设置值“ Validate Schema”。我得到一个假定看起来正确的数据类型的投影。值得注意的是,指向该源的数据集将所有列指定为字符串,因此在数据集的导入模式与源数据流转换的导入模式之间显然存在脱节。 看到这张图片Dataflow Source Projection

如果我尝试使用“验证架构”选项,则会遇到问题。我得到的第一个问题是,在不是字符串的任何数据类型上都出现错误。使用“数据预览”或在管道中运行数据流时,例如Error: at Source 'AvengersHeader': Column 'Appearances has incompatible types( Found: StringType,required: ShortType)。我以为这是由于标题行引起的,但是使用值为1的跳过行数排除了标题行给我一个新的错误,例如Error: at Source 'AvengersHeader': Missing column 'URL

来源documentation声明

验证架构:如果选择了 Validate schema ,如果传入的源数据与数据集的已定义架构不匹配,则数据流将无法运行。

我本以为可以查看数据类型,但是现在想知道这是否仅仅是提供的列。

对于水槽documentation,我说

验证架构:如果选择了验证架构,则在源投影中未找到传入源架构的任何列,或者数据类型不匹配时,数据流将失败。使用此设置可以强制源数据满足您定义的投影的约定。在数据库源方案中指示列名或类型已更改很有用。

我注意到几件事:

  1. 这指定了源中的更改
  2. 它指定源类型不匹配,但这似乎不匹配。

那么我的问题是,有人可以指向详细说明此行为和用法的特定文档吗?无论是官方的MS文档还是博客,我都一点都不挑剔。如果有人想把他们的2美分/便士扔进去也可以。

再来看一遍,我探索了派生列,然后进行条件拆分,但这可能会非常耗时:

`iif(
    isNull(toInteger(Appearances))==true()
||  isNull(toBoolean(case(or({Current?}=='',isNull({Current?})) == true(),'NO',{Current?})) )== true()    
||  isNull(toShort(Year)) == true()
||  isNull( toShort({Years since joining}))== true()
||  isNull(toBoolean(case(or(Death1=='',isNull(Death1)) == true(),Death1)) )== true()  
||  isNull(toBoolean(case(or(Return1=='',isNull(Return1)) == true(),Return1)) )== true() 
||  isNull(toBoolean(case(or(Death2=='',isNull(Death2)) == true(),Death2)) )== true()  
||  isNull(toBoolean(case(or(Return2=='',isNull(Return2)) == true(),Return2)) )== true() 
||  isNull(toBoolean(case(or(Death3=='',isNull(Death3)) == true(),Death3)) )== true()  
||  isNull(toBoolean(case(or(Return3=='',isNull(Return3)) == true(),Return3)) )== true() 
||  isNull(toBoolean(case(or(Death4=='',isNull(Death4)) == true(),Death4)) )== true()  
||  isNull(toBoolean(case(or(Return4=='',isNull(Return4)) == true(),Return4)) )== true()  
||  isNull(toBoolean(case(or(Death5=='',isNull(Death5)) == true(),Death5)) )== true()  
||  isNull(toBoolean(case(or(Return5=='',isNull(Return5)) == true(),Return5)) )== true(),1,0
)`

“条件拆分”转换查找符合条件的行并将其写入,在其他地方写入格式错误的行。
尽管此方法有效,但我不确定我会这样做,而是使用_corrupt_record的数据框感觉像它可以更轻松地解决我的问题,提出了一个问题,为什么我要尝试在“映射数据流”中进行验证?

解决方法

此错误Utilities.zip是由于您跳过了1行而无法找到名为URL的列。您需要在数据集的连接中选中“第一行作为标题”选项,而不是跳过1行。 enter image description here

源代码中的

“验证模式”选项正在将Projecting与数据集的模式进行比较。如果列及其类型不同,则数据流将失败。 enter image description here

enter image description here

因此,根据您的情况,我建议您不要选中“验证架构”选项,然后就可以正常工作。

enter image description here