1

GB 規模の非常に大きな xml ファイルをマージしました。データを読み取って処理するために、xpath クエリで次のコードを使用しています。

           IColumn column = output.Schema.FirstOrDefault(col => col.Type != typeof(string));
        if (column != null)
        {
            throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", column.Name, column.Type.Name));
        }


        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ConformanceLevel = ConformanceLevel.Auto;//.Fragment;
        XmlReader r = XmlReader.Create(input.BaseStream, settings);
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(r);
        //xmlDocument.LoadXml("<root/>");

        //xmlDocument.DocumentElement.CreateNavigator().AppendChild(r);
        //xmlDocument.Load(input.BaseStream);

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
        if (this.namespaces != null)
        {
            foreach (Match nsdef in xmlns.Matches(this.namespaces))
            {
                string prefix = nsdef.Groups[1].Value;
                string uri = nsdef.Groups[3].Value;
                nsmgr.AddNamespace(prefix, uri);
            }
        }

        foreach (XmlNode xmlNode in xmlDocument.DocumentElement.SelectNodes(this.rowPath, nsmgr))
        {
            foreach (IColumn col in output.Schema)
            {
                var explicitColumnMapping = this.columnPaths.FirstOrDefault(columnPath => columnPath.Value == col.Name);
                XmlNode xml = xmlNode.SelectSingleNode(explicitColumnMapping.Key ?? col.Name, nsmgr);
                output.Set(explicitColumnMapping.Value ?? col.Name, xml == null ? null : xml.InnerXml);
            }
            yield return output.AsReadOnly();
        }

ただし、MB 規模の小さなファイルでのみうまく機能します。ローカルでは問題なく動作しますが、ADLA では失敗します。名前空間マネージャーも使用する必要があります。より大きなファイルを処理できるようにスケーリングするにはどうすればよいですか。巨大なファイルを含むジョブを送信すると、情報なしで常にこのエラーが発生します。

VertexFailedError

4

1 に答える 1

1

MSDN フォーラムで回答した回答を同じ質問にコピーします。

既定では、U-SQL エクストラクタは、エクステントと呼ばれる入力ファイルの小さな部分で並列に動作するようにスケール アウトされます。これらのエクステントのサイズは、それぞれ約 250MB です。

処理しているデータがエクステントに収まらない場合は、エクストラクタがファイル全体を表示する必要があることを C# 属性でエクストラクタに伝える必要があります。これを行うには、extractor クラスの前に次の部分を追加します。

[SqlUserDefinedExtractor(AtomicFileProcessing = true)] 

あなたの場合、パーサーはドキュメントの最初と最後を確認する必要があるため、明らかに XML ドキュメントを分割することはできません。これは、XML ドキュメントが 1 つしかない場合に特に当てはまります (補足: 単一の XML ドキュメントまたは JSON ドキュメントの GB を持つことは、多くの場合、悪い考えです)。

さらに、こちらの GitHub サイト ( https://github.com/Azure/usql/tree/master/Examples/DataFormats ) で提供されているサンプルの XML エクストラクタを確認することをお勧めします。

于 2016-04-07T20:51:43.067 に答える