Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

python3没有现成的创建指定库/表的接口 #12

Open
charmby opened this issue May 8, 2023 · 3 comments
Open

python3没有现成的创建指定库/表的接口 #12

charmby opened this issue May 8, 2023 · 3 comments

Comments

@charmby
Copy link

charmby commented May 8, 2023

script = f"""
dataPath = "{self.db_client.db_url}"
db = database(dataPath)

        bar_columns = ["symbol", "exchange", "datetime", "interval", "volume", "turnover", "open_interest", "open_price", "high_price", "low_price", "close_price"]
        bar_type = [SYMBOL, SYMBOL, NANOTIMESTAMP, SYMBOL, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]
        bar = table(1:0, bar_columns, bar_type)

        db.createPartitionedTable(
            bar,
            "bar",
            partitionColumns=["datetime"],
            sortColumns=["symbol", "exchange", "interval", "datetime"],
            keepDuplicates=LAST)
        """
        self.db_client.execute(script)

我通过如上脚本进行执行的时候,一直报错,但是我看接口的参数我都传了

@charmby charmby changed the title python3没有现成的创建指定表 python3没有现成的创建指定库/表的接口 May 8, 2023
@charmby
Copy link
Author

charmby commented May 8, 2023

同时,这个设计特别奇怪

dbPath="dfs://db_value_date"
if s.existsDatabase(dbPath):
    s.dropDatabase(dbPath)
dates=np.array(pd.date_range(start='20120101', end='20120110'), dtype="datetime64[D]")
db = s.database(dbName='mydb', partitionType=keys.VALUE, partitions=dates,dbPath=dbPath)
df = pd.DataFrame({'datetime':np.array(['2012-01-01T00:00:00', '2012-01-02T00:00:00'], dtype='datetime64'), 'sym':['AA', 'BB'], 'val':[1,2]})
t = s.table(data=df)
db.createPartitionedTable(table=t, tableName='pt', partitionColumns='datetime').append(t)
re=s.loadTable(tableName='pt', dbPath=dbPath).toDF()

为什么建表的时候需要传入data,一般的应用场景下都是先create table再进行数据写入,难道每次想写入数据的时候都创建一个新的表???

@charmby
Copy link
Author

charmby commented May 8, 2023

dbPath="dfs://db_value_date"
if s.existsDatabase(dbPath):
    s.dropDatabase(dbPath)
dates=np.array(pd.date_range(start='20120101', end='20120110'), dtype="datetime64[D]")
db = s.database(dbName='mydb', partitionType=keys.VALUE, partitions=dates,dbPath=dbPath)
df = pd.DataFrame({'datetime':np.array(['2012-01-01T00:00:00', '2012-01-02T00:00:00'], dtype='datetime64'), 'sym':['AA', 'BB'], 'val':[1,2]})
t = s.table(data=df)
db.createPartitionedTable(table=t, tableName='pt', partitionColumns='datetime').append(t)
re=s.loadTable(tableName='pt', dbPath=dbPath).toDF()

另一个奇怪的点在于, database为什么要指定分区。。数据不应该是和表挂钩吗?一个表期望使用时间D进行分区?一个期望使用股票板块plate进行分区,另一个使用股票id进行分区
归属同一个数据库的时候难道要分别设置分区吗???为啥要和库挂钩??

@ffliu29
Copy link

ffliu29 commented May 9, 2023

问题 1: 您方便提供一下报错信息吗?
问题 2:建表语句为 db.createPartitionedTable(table=t, tableName='pt', partitionColumns='datetime'), 其中 table 参数提供的表只是作为创建表的表结构,它可以是一个空表也可以是个有数据的表,如果有数据是不会写入创建表的,真正写入数据的部分在 append(t)。如果表不存在,可以先创建一个表,如 pt = db.createPartitionedTable(table=t, tableName='pt', partitionColumns='datetime'),如果是已经存在的表,则先通过 pt = s.loadTable 加载 pt 表对象。后续可以通过 pt.append(t) 或者其他写入函数向该表写入数据,不需要创建一个新表。
问题 3:数据库分区有利于并行计算,增加可用性等等,关于数据库分区的说明可以参考教程:https://gitee.com/dolphindb/Tutorials_CN/blob/master/database.md。
相同分区方案的分区表可以存在同一个数据库。如果您希望数据表不分区可以使用维度表(通过函数 createTable 创建,此时您数据库可以任意设置一个分区方案),关于维度表的说明可以参考 https://www.dolphindb.cn/cn/help/130/FunctionsandCommands/FunctionReferences/c/createTable.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants