首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据从mysql导出以导入到questDb

将数据从mysql导出以导入到questDb
EN

Stack Overflow用户
提问于 2022-10-24 09:52:01
回答 3查看 66关注 0票数 3

mysql中有一个大表(大约500m行),我需要将特定的列导出到csv,以便能够导入到questDb中。

通常我会使用into outfile,但是RDS不支持这一点,因为没有对文件系统的访问。

我尝试过使用工作台进行导出,但是由于表的大小,我一直存在内存不足的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-24 09:53:56

最后,在以下帮助下找到了答案:将表从Amazon导出到CSV文件

只要您有某种顺序列,例如自动递增整数PK或日期列,此解决方案就会工作得很好。如果您有大量数据,请确保对日期列进行索引!

代码语言:javascript
运行
复制
#!bin/bash

# Maximum number of rows to export/total rows in table, set a bit higher if live data being written
MAX=500000000
# Size of each export batch
STEP=1000000

mkdir -p parts

for (( c=0; c<= $MAX; c = c + $STEP ))
do
   mysql --port 3306 --protocol=TCP -h <rdshostname> -u <username> -p<password> --quick --database=<db> -e "select column1, column2, column3 <table> order by <timestamp> ASC limit $STEP offset $c" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > export$c.csv

   # split down in to chunks under questdbs 65k line limit
   split -d -l 64999 --additional-suffix=.csv $FILE_NAME.csv ./parts/$FILE_NAME

done

# print out import statements to a file
for i in $(ls -v ./parts); do echo "COPY reading from '$i';" >> import.sql; done;

一种稍微不同的方法可能会更快,这取决于您已经建立的索引,它是一个月地遍历数据:

代码语言:javascript
运行
复制
#!bin/bash
START_YEAR=2020
END_YEAR=2022

mkdir -p parts

for (( YEAR=$START_YEAR; YEAR<=$END_YEAR; YEAR++ ))
do
   for (( MONTH=1; MONTH<=12; MONTH++ ))
   do

      NEXT_MONTH=1
      let NEXT_YEAR=$YEAR+1
      if [ $MONTH -lt 12 ]
      then
         let NEXT_MONTH=$MONTH+1
         NEXT_YEAR=$YEAR
      fi

      FILE_NAME="export-$YEAR-$MONTH-to-$NEXT_YEAR-$NEXT_MONTH"

      mysql --port 3306 --protocol=TCP -h <rdshost> -u app -p<password> --quick --database=<database> -e "select <column1>, <column2>, round(UNIX_TIMESTAMP(<dateColumn>)) * 1000000 as date from <table> where <table>.<dateColumn> >= '$YEAR-$MONTH-01 00:00:00' and table.<dateColumn> < '$NEXT_YEAR-$NEXT_MONTH-01 00:00:00' order by <table>.<dateColumn> ASC" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $FILE_NAME.csv

      # split down in to chunks under questdbs 65k line limit
      split -d -l 64999 --additional-suffix=.csv $FILE_NAME.csv ./parts/$FILE_NAME
   done
done

# print out import statements to a file
for i in $(ls -v ./parts); do echo "COPY reading from '$i';" >> import.sql; done;

上面的脚本将输出一个import.sql,其中包含导入数据所需的所有sql语句。请参阅:https://questdb.io/docs/guides/importing-data/

票数 3
EN

Stack Overflow用户

发布于 2022-10-24 10:31:09

编辑:此解决方案仅在导出整个表时才能工作,而不是在导出特定列时工作。

您可以尝试使用带有额外参数的mysqldump进行CSV转换。AWS 文档如何在RDS中使用mysqldump,您可以看到在这种堆叠溢出的问题上,如何使用额外的参数来转换为CSV

我在这里引用最后一个链接的相关部分(因为有很多答案和评论)。

代码语言:javascript
运行
复制
mysqldump <DBNAME> <TABLENAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/
票数 1
EN

Stack Overflow用户

发布于 2022-10-25 11:33:38

可以使用SELECT ... INTO OUTFILE语法将数据导出到服务器上的文件。然后,您可以使用mysql命令行客户端连接到RDS实例,并从服务器检索文件。唯一的小问题是,除非实例在VPC中,否则mysql不会连接到RDS实例,所以如果不是,您需要先连接到堡垒主机,然后再从那里连接到RDS实例。SELECT * FROM mydb.mytable INTO OUTFILE '/tmp/mytable.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';然后您可以从server:mysql -uusername -p -hmyrds.rds.amazonaws.com -P3306获得文件,当您从mysql命令行客户机获得提示符时,您可以使用SELECT命令:SELECT LOAD_FILE('/tmp/mytable.csv');检索文件,然后可以使用:SELECT LOAD_FILE('/tmp/mytable.csv') INTO OUTFILE '/tmp/mytable_out.csv';将输出输送到文件中,然后可以使用mysql命令行客户端连接到questDB实例并加载数据。如果要检索特定列,则可以在RDS服务器上创建文件时,在SELECT命令中指定列名:SELECT column1, column2, column3 FROM mydb.mytable INTO OUTFILE '/tmp/mytable.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74179359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档