2010-02-17 12 views
14

Czy ktoś wie o jakichkolwiek narzędziach do zapewnienia prostych, szybkich zapytań o płaskie pliki przy użyciu języka deklaratywnego zapytań podobnego do SQL? Wolałbym nie płacić narzut ładowania pliku do bazy danych, ponieważ dane wejściowe są zwykle wyrzucane prawie natychmiast po uruchomieniu zapytania.Proste, szybkie zapytania SQL dla plików płaskich

Rozważmy plik danych „animals.txt”:

dog 15 
cat 20 
dog 10 
cat 30 
dog 5 
cat 40 

Załóżmy, że chcemy, aby wyodrębnić najwyższą wartość dla każdego unikalnego zwierzęcia. Chciałbym napisać coś takiego:

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1" 

mogę dostać prawie taki sam wynik używając sort:

cat animals.txt | sort -t " " -k1,1 -k2,2nr 

I zawsze mogę wpaść awk stamtąd, ale to wszystko czuje się trochę awk oddział (nie mógł się oprzeć), gdy język podobny do języka SQL mógłby rozwiązać problem tak czysto.

Zastanawiałem się nad napisaniem otoki dla SQLite, która automatycznie tworzyłaby tabelę na podstawie danych wejściowych, i przyjrzałem się używaniu Hive w trybie jednoprocesorowym, ale nie mogę oprzeć się wrażeniu, że ten problem ma zostało rozwiązane wcześniej. Czy czegoś brakuje? Czy ta funkcjonalność jest już wdrożona przez inne standardowe narzędzie?

Halp!

Odpowiedz

0

nigdy nie udało się znaleźć satysfakcjonującej odpowiedzi na moje pytanie, ale przynajmniej udało znaleźć rozwiązanie mojego problemu zabawek przy użyciu opcji „-f” uniq S, który byłem nieświadomy:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \ 
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1 

Powyższa część może oczywiście zostać pominięta, jeśli plik wejściowy został utworzony z kolumnami w odwrotnej kolejności.

Nadal jednak nie mam nadziei na narzędzie podobne do SQL.

0

Będziemy mam lightweight ORM for sqlite że uproszczenia tego zadania bez konieczności żadnych plików konfiguracyjnych itd

Jeśli można za pomocą PowerShell ma wiele potężnych możliwościach w celu analizowania i odpytywanie plików tekstowych (example here). W przeciwnym razie przy użyciu .NET/Mono możesz to zrobić i użyć LINQ w mgnieniu oka.

+0

Chciałbym móc zrobić wszystko od powłoki, której to rozwiązanie nie obsługuje. – plinehan

+0

Który? Powershell to bash na sterydach, który pozwala zrobić wszystko od powłoki. Jeśli chodzi o program OrmLite (który jest tym, czego bym użył), piszesz program linii, który importuje wszystkie dane do bazy danych, a następnie możesz użyć programu sqlite3.exe do zapytania z wiersza poleceń. – mythz

1

można użyć SQLite. Oto przykład użycia Pythona.

import sqlite3 
conn = sqlite3.connect('/tmp/test.db') 
cursor = conn.cursor() 
try: 
    cursor.execute("""create table table1 (word varchar not null, number varchar not null)""") 
except: pass 
cursor.execute("insert into table1 values ('dog', '15')") 
cursor.execute("insert into table1 values ('cat', '20')") 
cursor.execute("insert into table1 values ('dog', '10')") 
cursor.execute("select max(number) , word from table1 group by word") 
print cursor.fetchall() 

wyjście

$ ./python.py 
[(u'20', u'cat'), (u'15', u'dog')] 
+0

Chciałbym móc zrobić wszystko od powłoki, której to rozwiązanie nie obsługuje. – plinehan

1

Właśnie natknął this Python script który robi coś takiego, co chcesz, mimo że obsługuje tylko bardzo podstawowe pytania.

3

Napisałem TxtSushi głównie do SQL wybiera na płaskie pliki.Oto łańcuch poleceń dla przykładu (wszystkie z tych poleceń są od TxtSushi):

tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 
'select col1, max(as_int(col2)) from animals group by col1'

namecolumns jest wymagane tylko dlatego animals.txt nie ma wiersz nagłówka. Możesz szybko zorientować się, co jest możliwe, przeglądając example scripts. Istnieją również linki do podobnych narzędzi na dole strony głównej.

+0

Bardzo ładne. Jak dobrze skaluje? Mam nadzieję, że poradzę sobie z plikami muti-gigabajtów, które przekraczają dostępną pamięć RAM na moim komputerze. – plinehan

+1

Wykonuje dowolne filtrowanie wierszy lub zaznaczanie kolumn za pomocą metody strumieniowania, ale gdy tylko poprosisz, aby zrobił coś, co wymaga sortowania (grupa przez, dołącz, zamówienie według wszystkich wymaganych sortowań), chce odczytać pełną tabelę do pamięci . W tym przypadku możesz podać opcję -external-sort, która nakazuje TxtSushi sortowanie na dysku, ale moja obecna implementacja sortowania zewnętrznego jest bardzo nieefektywna i wymaga trochę pracy. – Keith

0

można szukać HXTT JDBC Drivers. Zapewniają sterowniki JDBC dla większości typów plików płaskich, excel itp.

Można na nim wykonywać proste zapytania SQL.

Dostępne są wersje próbne

Powiązane problemy