2016-09-01 1 views
0
내가 기존 테이블에 파일에서 새 열을 추가 할

에서 기존 테이블에 파일에서 열을 추가 파일 1 열, 23,710 선이, 모든 번호 :<code>cbind</code>는 R.</p> <p>에서 수행하는 방식으로, MariaDB 10.1

ALTER TABLE my_table ADD COLUMN IF NOT EXISTS sample69 INT(10) DEFAULT NULL; 
LOAD DATA LOCAL INFILE '/var/www/html/my_website/my_sample.txt' INTO TABLE my_table LINES TERMINATED BY '\n' (sample69); 

하기 전에 :

,763,371

[email protected]_server:/var/www/html/my_website$ head my_sample.txt 
61 
66 
0 
330 
76 
9 
10 
16 
6 
0 

코드를 사용하여 3,949,013,210

후 :

MariaDB [my_database]> select * from my_table limit 10; 
+------------+-----------+-----------+ 
| geneSymbol | sample000 | sample69 | 
+------------+-----------+-----------+ 
| A1BG  |  61 |  NULL | 
| A1BG-AS1 |  66 |  NULL | 
| A1CF  |   0 |  NULL | 
| A2M  |  330 |  NULL | 
| A2M-AS1 |  76 |  NULL | 
| A2ML1  |   9 |  NULL | 
| A2MP1  |  10 |  NULL | 
| A4GALT  |  16 |  NULL | 
| A4GNT  |   6 |  NULL | 
| AA06  |   0 |  NULL | 
+------------+-----------+-----------+ 

MariaDB [my_database]> select count(*) from my_table; 
+----------+ 
| count(*) | 
+----------+ 
| 47420 | 
+----------+ 

이 명백하게 열의 단부에 데이터를 추가한다. 대신 새 열의 길이가 23710이고 파일의 새 데이터로 채워지 길 원합니다.

내가 뭘 잘못하고 있니?

답변

1

LOAD은 전체 행만로드합니다.

하나의 열만로드 할 수 있다고해도 각 번호가 어떤 행과 연결되는지 어떻게 알 수 있습니까?

두 개의 열 (geneSymbol 및 sample69)로 데이터를 재구성하고이를 임시 테이블에로드 한 다음 다중 테이블 JOIN을 수행하여 데이터를 주 테이블로 이동해야합니다. 그것이 잘못된 방향으로 스키마를 설계하는 것을 부칙

당신은 샘플의 69 열이있는 경우

. 어떤 시점에서 한계에 부딪 힐 것입니다.

계획 A : 행의 많은 열이 아닌 많은 :

CREATE TABLE x (
    geneSymbol VARCHAR(..) ..., 
    num SMALLINT UNSIGNED NOT NULL, 
    value SMALLINT UNSIGNED NOT NULL, 
    PRIMARY KEY(geneSymbol, num) 
) ENGINE=InnoDB 

플랜 B (이것은 각각의 새로운 샘플을 추가하는 코드가 필요합니다) :

CREATE TABLE x (
    geneSymbol VARCHAR(..) ..., 
    text NOT NULL, -- JSON encoded list of samples for that gene 
    PRIMARY KEY(geneSymbol) 
) ENGINE=InnoDB 

계획 C (읽기위한 하나의 샘플) :

CREATE TABLE x (
    num SMALLINT UNSIGNED NOT NULL, 
    text NOT NULL, -- JSON encoded list of values for that sample 
    PRIMARY KEY(num) 
) ENGINE=InnoDB 

검색어는 어떻게됩니까? 나는 당신이 모든 데이터를 읽는다고 의심한다. 어떤 숫자도하지 않고 WHERE 절을 기초로하고 있지 않습니까?

+0

이 내용은 설명과 통찰력을 제공합니다. 그러나 새로운 샘플을 처리하자마자 매번 단일 열을 동적으로 추가하므로 테이블이 커지면 더 느려지지만 성가 시게됩니다. –

+0

몇 가지 옵션을 추가했습니다. –

+0

좋은 계획! 나는 100 개 이상의 샘플을 가지고있을 것이고, 사용자에게 필터링을 남기고 부트 스트랩 테이블에 피드를 제공하기 위해 모든 데이터를 읽을 것입니다. Plan A는 결국 GeneSymbol과 샘플의 중복 된 수백만 개의 행을 제공합니다. Plan B와 C는 Json 으로의 열을 줄이는 데는 좋지만 Json은 단일 셀에서 다소 큰 데이터를 보유합니다. 실제로 어떤 플랜에도 적응할 수 있지만, 후자가 배경에 있고 시간이 문제가 아니기 때문에 데이터 크기를 고려하여 * 검색 *하는 것이 가장 좋습니다. 그러나 시간은 문제가 아니지만 이전은 사용자가 될 것입니다. 대화 형 및 빠른 디스플레이가 필수적입니까? –