【问题标题】:SQL loop to read, then write data to fileSQL循环读取,然后将数据写入文件
【发布时间】:2011-12-10 23:50:11
【问题描述】:

我有一个包含 5700 万行和 23 列的数据集。有一列包含不同鸟类的物种名称(大约 2000 个唯一名称),我想为每个唯一的物种名称提取两列数据(纬度,经度),并写入每个文件的纬度/经度数据种,以种名作为文件名。从我知道的唯一语言 R 开始,这需要很长时间。该任务的适当代码是什么?

我在这里尝试一些伪代码来演示我猜测的代码大概是什么样子:

FOR i IN 1:unique(species_name)
    SELECT latitude,longitude WHERE species_name=[i]
    WRITE [some code that writes a text file with species name as the file name]
LOOP END;

我想我可以在 OSX 上的终端中做这种事情?

编辑 20111211: 这是我在 R 中的工作流程:

 require(RMySQL);
 require(plyr)
 drv <- dbDriver("MySQL")
 con <- dbConnect(drv, user = "asdfaf", dbname = "test", host = "localhost")
 splist <- read.csv("splist_use.csv")
 sqlwrite <- function(spname) {
   cat(spname) g1 <- dbGetQuery(con
     , paste("SELECT col_16,col_18 FROM dat WHERE col_11='"
     , spname, "'", sep="")
     )
   write.csv(g1, paste(spname, ".csv", sep=""))
   rm("g1") }
 l_ply(splist, sqlwrite, .progress="text" )

【问题讨论】:

  • 您使用的是什么 SQL 服务器?大多数都提供导出功能,我认为在您的特定情况下会快得多。
  • MySQL。我唯一的 GUI 界面是 SequelPro。
  • 对,我可以导出,但我必须过滤物种,然后导出,然后做 2000 次,这有点多。

标签: mysql sql r plyr


【解决方案1】:

恕我直言,您能做的最好的事情是使用脚本语言(python、perl、php、shell)并从那里生成文件名和查询。这不是太难,但你必须学习一门不同的语言。 SQL 不适合命令式编程。

【讨论】:

  • 好的。我希望有一个 R 解决方案,从 R 调用 MySQL,但我可能应该为这个特定问题学习适当的语言。
  • 如果您对 R 感到满意,请使用 R。我知道 R 有一个 postgres 接口,也可能有一个 mysql 接口。只需发布您所拥有的内容,人们可以在 R 部分或 sql 部分或接口部分为您提供帮助。为了您的理智:以“只读”方式访问数据库,或处理数据库的副本,或确保您有备份。
  • 这是我来自 Rrequire(RMySQL) 的工作流程; require(plyr) drv
  • 只需添加一个空行并将代码块缩进 4 个空格。顺便说一句,我添加了一个“)”,并将其切成线条以适合表格的宽度;希望 R 允许这样的多行语句(我不知道 R)。现在代码块完成了吗?
【解决方案2】:

您是否尝试过使用 MySQL 输出文件功能?

SELECT col_16,col_18 
FROM 
dat 
WHERE col_11= spiecesname
INTO OUTFILE '/tmp/spiecesname.csb'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

通过一些工作,您可以让 MySQL 挑选出每个唯一的物种名称,循环遍历结果并输出到一个唯一的 csv 文件。

你的查询应该有一个 order by 子句

【讨论】:

  • 太棒了,谢谢你的提示。不久前我从朋友那里找到了一个使用 PHP 和 MySQL 的解决方案,但这很好。
【解决方案3】:

可以接受 Excel 文件输出吗?你有 excel 吗?如果是这样,您可以使用 Excel 连接到数据库,并发出查询以提取数据。然后在 .xls 或 csv 中。格式。但是,这假设您的结果小于 1,000,000。

在excel中 转到数据选项卡 从其他来源中选择 选择并输入首选连接方法 您可以在此处定义要运行的表或查询。 (如果结果少于您所在的 excel 版本的工作表上支持的行数)然后使用您选择的方法将提取文件。应该比您当前执行的 IO 更快。

【讨论】:

  • 有趣。我不知道这是可能的。我已经使用了 PHP/MySQL 解决方案,但这是一个很好的替代解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 2021-03-13
  • 2013-02-01
  • 2018-07-02
  • 2015-06-28
  • 2023-04-02
  • 2019-11-18
  • 2021-11-14
相关资源
最近更新 更多