什么在我输入数据之前重新格式化我的输入数据?

What's reformatting my input data before I get to it?

我有一个 Data Lake Store 帐户。我有一个充满文件的目录,其中包含 JSON 格式的数据,包括一些包含 ISO 8601 格式时间的字符串值,即:{ "reading_time": "2008-09-15T15:53:00.91077" }

现在,当我使用使用这些 JSON 文件作为输入数据集的数据工厂创建管道时,它会以典型的美国格式看到 reading_time 的值:"9/15/2008 3:53:00 PM" .具体来说,当我尝试在输出数据集中填充 DateTime 字段时收到此消息:

Column 'reports.reading_time' contains an invalid value '9/15/2008 3:53:00 PM'. Cannot convert '9/15/2008 3:53:00 PM' to type 'DateTime'

我想嘿,如果我告诉我的输入数据集特别期望 ISO 输入日期怎么办?所以我在我的管道规范中尝试了这个:

"datasets": [
  {
    "name": "ImprovedInputDataset",
      "properties": {
        "structure": [
          {
            "name": "reports.reading_time",
            "type": "Datetime",
            "format": "ISO"
          }
        ]
      }
    }
  }
]

我对自己收到的错误消息略有不同感到印象深刻(请参阅最后的 "with format 'ISO'"):

Column 'reports.reading_time' contains an invalid value '9/15/2008 3:53:00 PM'. Cannot convert '9/15/2008 3:53:00 PM' to type 'DateTime' with format 'ISO'

长话短说,好像有什么东西注意到了我原始输入中的 ISO 日期格式,并让我怀疑 "favor" 将其转换为美式日期字符串 before 我的管道可以看到它。我无法在 Azure 在线文档中找到任何内容来准确解释在我的管道规范执行之前我的输入数据集发生了什么。

如果有人愿意 a) 向我解释将我的 ISO date/time 字符串转换为美国类型 date/time 字符串的原因以及如何更正它,我将不胜感激;或 b) 在我的管道规范为 运行.

之前,将我指向数据工厂内部必须发生的 "preprocessing" 文档

我可以重现此问题,但使用 "String" 数据类型作为输入数据集使其正常工作。您也可以不指定数据类型,例如

{
    "name": "InputDataset-9ad",
    "properties": {
        "structure": [
            {
                "name": "reading_time"
            }
        ],
...

这符合我目前的想法,即 JSON 本身没有日期时间数据类型。 Documentation 建议格式为 .net 格式,"ISO" 永远行不通。我花了一些时间尝试调试许多不同的日期格式,例如 "yyyy-MM-ddTHH:mm:ss.fffffff" 但它们都不起作用。我的猜测是 JSON 根本不支持日期时间,或者它有问题/ "T" 有问题并且基本上忽略了格式并默认为某些东西,在你的例子中看起来像 "en-US" .

我确实发现大多数日期格式 "just work" 都没有指定结构。如果您确实有一些非国际性或非国际性的东西 table,例如“01/04/2017”(是 4 月 1 日还是 1 月 4 日?)那么解决方法是将其导入暂存 table 作为字符串并从那里转换。

我有一个关于内部新闻组的未决问题,如果我收到任何进一步的信息,我会更新这个 post。注意我不为微软工作。

HTH

Microsoft 文档具有以下内容 link:type mapping 教导在这些情况下该怎么做

基本上可以指定导出的数据格式 json格式字符串与C#语言使用的相同.