我正在使用具有数百万行和100多列的Oracle数据库.我试图使用带有索引的某些列的pytables将这些数据存储在HDF5文件中.我将在pandas DataFrame中读取这些数据的子集并执行计算.
我尝试过以下方法:
下载表,使用实用程序到csv文件,使用pandas通过chunk读取csv文件块并使用附加到HDF5表pandas.HDFStore.我创建了一个dtype定义并提供了最大的字符串大小.
但是,现在当我尝试直接从Oracle DB下载数据并将其发布到HDF5文件时pandas.HDFStore,我遇到了一些问题.
pandas.io.sql.read_frame不支持分块读取.我没有足够的RAM能够先将整个数据下载到内存中.
如果我尝试使用cursor.fecthmany()固定数量的记录,那么DB表中的读取操作需要很长时间才能被索引,我必须读取属于日期范围的记录.但是我使用的DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
是,创建的DataFrame总是推断dtype而不是强制执行我提供的dtype(与read_csv不同,它遵循我提供的dtype).因此,当我将此DataFrame附加到已存在的时HDFDatastore,存在类型不匹配,例如,float64可能在一个块中被解释为int64.
如果你们能提出你的想法并指出我正确的方向,那就表示赞赏.
我有以下示例文件:
"id";"PCA0";"PCA1";"PCA2"
1;6.142741644872954;1.2075898020608253;1.8946959360032403
2;-0.5329026419681557;-8.586870627925729;4.510113575138726
Run Code Online (Sandbox Code Playgroud)
当我尝试阅读时:
d <- read.table("file.csv", sep=";", header=T)
Run Code Online (Sandbox Code Playgroud)
id是一个整数列,PCA0一个数字,所有后续列都是因子
class(d$iid)
[1] "integer"
class(d$PCA0)
[1] "numeric"
class(d$PCA1)
[1] "factor"
class(d$PCA2)
[1] "factor"
Run Code Online (Sandbox Code Playgroud)
为什么其他列也不是数字?
我知道如何转换列,但我希望我的脚本能够在不手动转换类型的情况下工作.为什么R不识别数字列?
使用SQL Loader控制文件时如下:
OPTIONS(**skip=1**,bindsize=1048576,rows=1024)
LOAD DATA
INFILE 'C:\Documents and Settings\FIRST.CSV'
INFILE 'C:\Documents and Settings\SECOND.CSV'
APPEND
INTO TABLE table_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
fields
)
Run Code Online (Sandbox Code Playgroud)
它会跳过FIRST.CSV文件的标题行,但会将SECOND.CSV中的标题行加载到Oracle表中.我的解决方案是将此控制文件分成两个单独的文件.有没有办法遵守一个控制文件?
我目前有2个返回的查询
PRODUCER FirstQueryColumn
------------------------------ ----------------------
aaaaaaaaaaaa 1
bbbbbbbbbbb 1
PRODUCER SecondQueryColumn
------------------------------ ----------------------
aaaaaaaaaaaa 2
bbbbbbbbbbb 1
Run Code Online (Sandbox Code Playgroud)
我想知道的是我应该如何制作它以便我可以在一个查询中获得相同的数据,也就是说,我想要的东西会产生(Producer, FirstQueryColumn, SecondQueryColumn).
我怎样才能做到这一点?
这是我目前的查询:
select Producers.name Prod, count(Animals.idanimal) AnimalsBought
from AnimalsBought, Animals, Producers
where (AnimalsBought.idanimal = Animals.idanimal) and (Animals.owner = Producers.nif) group by Producers.name;
select Producers.name Prod, count(Animals.idanimal) AnimalsExploration
from AnimalsExploration, Animals, Producers
where (AnimalsExploration.idanimal = Animals.idanimal) and (Animals.owner = Producers.nif) group by Producers.name;
Run Code Online (Sandbox Code Playgroud)
如您所见,对于这种情况,连接不会做太多:
select Producers.name Prod, count(AnimalsBought.idanimal) AnimalsBought, count(AnimalsExploration.idanimal) AnimalsExploration
from Producers, Animals, AnimalsBought, AnimalsExploration
where (AnimalsExploration.idanimal = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此 Plsql 将值返回到 Apex 页面项中。页面项源是 PL/SQL 函数体。
DECLARE
v_val VARCHAR2 (3000 CHAR);
CURSOR c_mylist
IS
select * from table_mylist
order by id;
BEGIN
FOR r_mylist IN c_mylist
LOOP
--dbms_output.put_line( c_mylist.item );
v_val := c_mylist.item ||' '||c_mylist.item;
END LOOP;
return v_val;
END;
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,它只将游标的最后一个值返回到页面项中,而不是所有行值。在 SQL Developer 中尝试使用 dbms_output.put_line 显示正确的结果。我的脚本出了什么问题?
oracle ×3
database ×1
hdf5 ×1
join ×1
oracle-apex ×1
pandas ×1
plsql ×1
pytables ×1
python ×1
r ×1
return-value ×1
sql ×1
sql-loader ×1