2013-04-18 4 views
1

Я написал сценарий q для создания секционированной таблицы и вставки строк из большого файла kdb, который я ранее сохранил. Сценарий сохраняет данные только за конкретную дату, которую я передаю из командной строки.Как удалить содержимое разделенной таблицы kdb?

Как я могу очистить содержимое секционированной таблицы в начале сценария? Или больше вообще, как я могу застраховать содержимое таблицы, не дублируется, если я запускаю сценарий несколько раз?

+0

Если ваш скрипт использует '.Q.dpft []' писать каждый раздел, то вам не нужно беспокоиться о дублировании: функция перезаписывает любой существующие данные в таблице на эту дату. – mollmerx

ответ

3

Отправляясь предположим, что ваш распределяли по дате, так структуре каталогов:

2012.04.03 
      /trade 
2012.04.04 
      /trade 
2012.04.05 
      /trade 
       /ticker 
       /price 
       /size 
  1. Чтобы очистить содержимое в течение одного дня просто удалить эту папку, а затем \l.

  2. Для предотвращения дублирования проверки, если какие-либо данные первого существует для этой даты:

    select count i from trade where date=2012.04.06

Если один данные даты могут поступать из различных файлов, делает его сложнее. Вы можете добавить столбец sourceFile и/или отдельную таблицу, чтобы отслеживать, какие файлы были загружены.

+0

Что вы подразумеваете под «а затем \ |»? –

+1

Он означает, что вы должны перегруппировать таблицу, чтобы увидеть изменения. См. Http://code.kx.com/wiki/JB:KdbplusForMortals/partitioned_tables#1.3.5_Modifying_Partitioned_Tables – user1895961

+0

@RobertKubrick это '\ l', btw, а не' \ | ' – mollmerx

1

Вы также можете включить процесс удаления в функцию q. Say места вы пишете в формате:

/hdb/date/tablename/colname 

q) db1:"/hdb/date"; /you can pass this as a argument in a function 

q) deletedb:{[dbname] systemcmd: "rm -rfv ",dbdelete; system systemcmd} 

q) deletedb db1