2016-08-15 4 views
2

Ich teste Daten Lake für eine Anwendung, die ich entwickle. Ich bin neu in U-SQL und Data Lake und versuche nur alle Datensätze in einer JSON-Datei abzufragen. Gerade jetzt, Es ist nur ein Datensatz zurückkehren und ich bin mir nicht sicher, warum, weil die Datei 200 hat überU-SQL Json Extractor zieht nur einen Datensatz

Mein Code ist:

DECLARE @input string = @"/MSEStream/output/2016/08/12_0_fc829ede3c1d4cf9a3278d43e7e4e9d0.json"; 

REFERENCE ASSEMBLY [Newtonsoft.Json]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 


@allposts = 
EXTRACT 
    id string 
FROM @input 
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor(); 

@result = 
SELECT * 
FROM @allposts; 

OUTPUT @result 
TO "/ProcessedQueries/all_posts.csv" 
USING Outputters.Csv(); 

Daten Beispiel:

{ 
"id":"398507", 
"contenttype":"POST", 
"posttype":"post", 
"uri":"http://twitter.com/etc", 
"title":null, 
"profile":{ 
    "@class":"PublisherV2_0", 
    "name":"Company", 
    "id":"2163171", 
    "profileIcon":"https://pbs.twimg.com/image", 
    "profileLocation":{ 
     "@class":"DocumentLocation", 
     "locality":"Toronto", 
     "adminDistrict":"ON", 
     "countryRegion":"Canada", 
     "coordinates":{ 
     "latitude":43.7217, 
     "longitude":-31.432}, 
     "quadKey":"000000000000000"}, 
     "displayName":"Name", 
     "externalId":"00000000000"}, 
    "source":{ 
     "name":"blogs", 
     "id":"18", 
     "param":"Twitter"}, 
    "content":{ 
     "text":"Description of post"}, 
     "language":{ 
      "name":"English", 
      "code":"en"}, 
     "abstracttext":"More Text and links", 
     "score":{} 
    } 
} 

Vielen Dank für die Hilfe im Voraus

Antwort

2

Der JsonExtractor verwendet ein Argument, mit dem Sie angeben können, welche Elemente oder Objekte in Zeilen mithilfe eines JSON-Pfadausdrucks abgebildet werden. Wenn Sie nichts angeben, wird der oberste Stamm (der eine Zeile enthält) benötigt.

Sie wollen jedes der Elemente im Array, so geben Sie es als:

neuen Microsoft.Analytics.Samples.Formats.Json.JsonExtractor weiter verwenden ("[*]");

Wo [*] ist der JSON-Pfad-Ausdruck, der sagt, geben Sie mir alle Elemente des Arrays, in diesem Fall ist die oberste Ebene Array.

+0

Wenn ich das einfüge gibt es nichts zurück. Ich füge ein Beispiel für die Daten hinzu, die ich in der Post ziehe. – WorkHardWork

+0

Ich habe herausgefunden, was passiert ist, die Ausgabedatei ist eine Zeile getrennte Datei. Gibt es eine Möglichkeit, es so zu lesen oder muss ich es als Array formatieren? – WorkHardWork

+0

Sie können entweder Ihren eigenen Extraktor schreiben, der die Zeile pro Zeile bearbeitet, indem Sie den aktuellen JSONExtractor erweitern (schauen Sie sich die anderen Extraktoren auf unserem GitHub unter http://usql.io an), oder Sie verwenden einen eingebauten im Extraktor und lesen Sie den JSON out als String (maximale Länge ist dann 128kB). Ein Beispiel ist hier https://github.com/Azure/usql/blob/master/Examples/DataFormats/Microsoft.Analytics.Samples.Formats/readme.md –

1

Wenn Sie in Ihrem Feld einen JSON-Knoten mit dem Namen id haben, gibt Ihr ursprüngliches Skript in der Frage den Knoten mit dem Namen "id" unter dem Stammknoten zurück. Um alle Knoten zu erhalten, wird Ihr Skript wie folgt strukturiert sein:

@allposts = 
EXTRACT 
    id string, 
    contenttype string, 
    posttype string, 
    uri string, 
    title string, 
    profile string 
FROM @input 
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor(); 

Bitte lassen Sie uns wissen, wenn es funktioniert. Die Alternative wäre, sie mit einem nativen Extraktor zu extrahieren, um alles in einer Zeichenkette zu lesen (wie MRys erwähnt, solange Ihre JSON unter 128 KB ist, würde dies funktionieren).

@allposts = 
EXTRACT 
    json string 
FROM @input 
USING Extractors.Text(delimiter:'\b', quoting:false); 
+0

'Extractors.Csv' erlaubt keine Trennzeichen. – WorkHardWork

+0

Können Sie stattdessen Extractors.Text mit der gleichen Syntax verwenden? –