Also strongly +1 to copying all the options.

On Wed, Oct 23, 2024 at 5:52 AM Josh McKenzie <jmcken...@apache.org> wrote:

> I'm a very strong +1 to having the default functionality be to copy *ALL*
> options.
>
> Intuitively, as a user, if I tell a software system to make a clone of
> something I don't expect it to be shallow or a subset defined by some
> external developer somewhere. I expect it to be a clone.
>
> Adding in some kind of "lean" mode or "column only" is fine if someone can
> make a cogent argument around its inclusion. I don't personally see a
> use-case for it right now but definitely open to being educated.
>
> On Wed, Oct 23, 2024, at 3:03 AM, Štefan Miklošovič wrote:
>
> options are inherently part of that table as well, same as schema. In
> fact, _schema_ includes all options. Not just columns and its names. If you
> change some option, you effectively have a different schema, schema version
> changes by changing an option. So if we do not copy options too, we are
> kind of faking it (when we do not specify WITH OPTIONS).
>
> Also, imagine a situation where Accord is merged to trunk. It introduces a
> new schema option called "transactional = full" which is not default. (I am
> sorry if I did the spelling wrong here). So, when you have a table with
> transactional support and you do "create table ks.tb_copy like ks.tb", when
> you _do not_ copy all options, this table will _not_ become transactional.
>
> The next thing you go to do is to execute some transactions against this
> table but well ... you can not do that, because your table is not
> transactional, because you have forgotten to add "WITH OPTIONS". So you
> need to go back to that and do "ALTER ks.tb_copy WITH transactional = full"
> just to support that.
>
> I think that you see from this pattern that it is way better if we copy
> all options by default instead of consciously opt-in into them.
>
> also:
>
> "but I think there are also some users want to do basic column information
> copy"
>
> where is this coming from? Do you have this idea somehow empirically
> tested? I just do not see why somebody would want to have Cassandra's
> defaults instead of what a base table contains.
>
> On Wed, Oct 23, 2024 at 8:28 AM guo Maxwell <cclive1...@gmail.com> wrote:
>
> The reason for using OPTION keyword is that I want to provide users with
> more choices .
> The default behavior for copying a table is to copy the basic item of
> table (column and their data type,mask,constraint),others thing belongs to
> the table like option,views,trigger
> are optional in my mind.
> You are absolutely right that users may want to copy all stuff but I think
> there are aslo some users want to do basic column information copy,So I
> just give them a choice。As we know that the number of table parameters is
> not small,compression,compaction,gc_seconds,bf_chance,speculative_retry and
> so on.
>
> Besides we can see that pg have also the keyword COMMENT,COMPRESSION which
> have the similar behavior as our OPTION keyword。
>
> So that is why I add this keyword OPTION.
>
>
> Štefan Miklošovič <smikloso...@apache.org>于2024年10月22日 周二下午11:40写道:
>
> The problem is that when I do this minimal CQL which shows this feature:
>
> CREATE TABLE ks.tb_copy LIKE ks.tb;
>
> then you are saying that when I _do not_ specify WITH OPTIONS then I get
> Cassandra's defaults. Only after I specify WITH OPTIONS, it would truly be
> a copy.
>
> This is not a good design. Because to have an exact copy, I have to make a
> conscious effort to include OPTIONS as well. That should not be the case. I
> just want to have a copy, totally the same stuff, when I use the minimal
> version of that statement. It would be better to opt-out from options like
>
> CREATE TABLE ks.tb_copy LIKE ks.tb WITHOUT OPTIONS (you feel me) but we do
> not support this (yet).
>
> On Tue, Oct 22, 2024 at 5:28 PM Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> I just don't see OPTIONS as important. When I want to copy a table, I am
> copying a table _with everything_. Options included, by default. Why would
> I want to have a copy of a table with options different from the base one?
>
>
> On Mon, Oct 21, 2024 at 3:55 PM Bernardo Botella <
> conta...@bernardobotella.com> wrote:
>
> Hi Guo,
>
> +1 for the CONSTRAINTS keyword to be added into the default behavior.
>
> Bernardo
>
> On Oct 21, 2024, at 12:01 AM, guo Maxwell <cclive1...@gmail.com> wrote:
>
> I think the CONSTRAINTS keyword  keyword may be in the same situation as
> datamask.
> Maybe it is better to include  constraints into  the default behavior of
> table copy together with column name, column data type and data mask.
>
> guo Maxwell <cclive1...@gmail.com> 于2024年10月21日周一 14:56写道:
>
> To yifan :
> I don't mind adding the ALL keyword, and it has been updated into CEP.
>
> As all you can see, our original intention was that the grammar would not
> be too complicated, which is what I described in cep
> <https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-43++Apache+Cassandra+CREATE+TABLE++LIKE>
> .
> We gave up PG-related grammar, including INCLUDING/EXCLUDING and so on .
>
> guo Maxwell <cclive1...@gmail.com> 于2024年10月21日周一 14:52写道:
>
> Hi ,
> To sefan :
> I may want to explain that if there is no OPTION keyword in the CQL
> statement, then the newly created table will only have the
> original table's  column name 、column type and data mask ,I think this is
> the most basic choice when copying tables to users.
> Then  we do some  addition, we can add original table's table options like
> compaction strategy/compress strategy、index and so on.
>
> Recently, I have also thought about the situation of CONSTRAINTS keyword.
> I think it is similar to data mask. Agree that it should be included in the
> basic options of  table copy (column name, column data type , column data
> mask and constraints).
>
>
> Dave Herrington <he...@rhinosource.com> 于2024年10月19日周六 01:15写道:
>
> It seems like a natural extension of the CREATE TABLE statement.  Looking
> forward to using it in the future.
>
> -Dave
>
> On Thu, Oct 17, 2024 at 5:11 PM Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> Right?! Reads like English, the impact on the existing CQL is minimal. One
> LIKE which basically needs to be there and keywords of logical "components"
> which seamlessly integrate with WITH.
>
> I would _not_ use WITH CONSTRAINTS because constraints will be inherently
> part of a table schema. It is not an "option". We can not "opt-out" from
> them. Remember we are copying a table here so if a base one has
> constraints, its copy will have them too. A user can subsequently "ALTER"
> them.
>
> On Thu, Oct 17, 2024 at 5:31 PM Dave Herrington <he...@rhinosource.com>
> wrote:
>
> Basing it on CREATE TABLE, the BNF definition of the simple implementation
> would look something like this:
>
> create_table_statement::= CREATE TABLE [ IF NOT EXISTS ] table_name LIKE
> base_table_name
> [ WITH included_objects ] [ [ AND ] table_options ]
> table_options::= COMPACT STORAGE [ AND table_options ]
> | CLUSTERING ORDER BY '(' clustering_order ')'
> [ AND table_options ]  | options
> clustering_order::= column_name (ASC | DESC) ( ',' column_name (ASC |
> DESC) )*
> included_objects::= dependent_objects [ AND dependent_objects ]
> dependent_objects:= INDEXES | TRIGGERS | CONSTRAINTS | VIEWS
>
>
> CREATE TABLE [ IF NOT EXISTS ] [<keyspace_name>.]<table_name> LIKE
> [<keyspace_name>.]<base_table_name>
>   [ WITH [ <included_objects > ]
>   [ [ AND ] [ <table_options> ] ]
>   [ [ AND ] CLUSTERING ORDER BY [ <clustering_column_name> (ASC | DESC) ] ]
> ;
>
> Examples:
>
> -- Create base table:
> CREATE TABLE cycling.cyclist_name (
>   id UUID PRIMARY KEY,
>   lastname text,
>   firstname text
> );
>
> -- Create an exact copy of the base table, but do not create any dependent
> objects:
> CREATE TABLE cycling.cyclist_name2 LIKE cycling.cyclist_name;
>
> -- Create an exact copy with all dependent objects (constraints excluded
> for now):
> CREATE TABLE cycling.cyclist_name3 LIKE cycling.cyclist_name
> WITH INDEXES AND TRIGGERS AND VIEWS;
>
> -- Create a copy with LCS compaction, a default TTL and all dependent
> objects except indexes:
> CREATE TABLE cycling.cyclist_name4 LIKE cycling.cyclist_name
> WITH TRIGGERS AND VIEWS
> AND compaction = { 'class' :  'LeveledCompactionStrategy' }
> AND default_time_to_live = 86400;
>
>
>
>
> This seems pretty clean & straightforward.
>
> -Dave
>
> On Thu, Oct 17, 2024 at 4:05 PM Dave Herrington <he...@rhinosource.com>
> wrote:
>
> This simple approach resonates with me.  I think the Cassandra doc uses
> "INDEXES" as the plural for index, i.e.:
> https://cassandra.apache.org/doc/stable/cassandra/cql/indexes.html
>
> -Dave
>
> On Thu, Oct 17, 2024 at 2:39 PM Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> Well we could do something like:
>
> CREATE TABLE ks.tb_copy LIKE ks.tb WITH INDICES AND TRIGGERS AND
> compaction = {'class': '.... } AND ...
>
> but I can admit it might be seen as an overreach and I am not sure at all
> how it would look like in the implementation because we would need to
> distinguish WITH INDICES from table options.
>
> I would
>
>    1. +0 on ALL. - we don't need this. If we have just INDICES, TRIGGERS,
>    VIEWS at this point, I don't think enumerating it all is too much to ask.
>    This is just an implementation detail and if we find it necessary we can
>    add it later. If you feel strongly about this then add that but it is not
>    absolutely necessary.
>    2. omit OPTIONS - aren't all options copied by default? That is the
>    goal of the CEP, no? We might just use normal CQL while overriding
>    from the base table
>    3. mix keywords like TRIGGERS / INDICES / CONSTRAINTS into normal
>    table creation statement
>
>
>
> On Thu, Oct 17, 2024 at 3:20 PM Yifan Cai <yc25c...@gmail.com> wrote:
>
> I would second Štefan's option for functionality simplicity. It seems to
> be unnecessary to have the keywords for both inclusion and exclusion in the
> CEP. If needed, the exclusion (WITHOUT) can be introduced later. It would
> still be backward compatible.
>
> Regarding "CREATE TABLE ks.tb_copy LIKE ks.tb WITH compaction = {'class':
> '.... } AND ... ", I think it only overrides the table options. The CEP
> suggests the coarse-grained keyword for each category like table options,
> indexes, etc. The functionality provided is not identical.
>
> I understand that the suggestions are to make operators' life easier by
> achieving table creation in a single statement. What is being proposed in
> the CEP seems to be at a good balance point. Operators can alter the table
> options if needed in the follow-up ALTER table statement.
>
> - Yifan
>
>
>
> On Thu, Oct 17, 2024 at 1:41 PM Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> I think we are starting to complicate it. For me the most important
> question is who is actually this feature for? If people want to just
> prototype something fast or they just want to have "the same table just
> under a different name", I think that is going to be used in 99% of cases.
>
>
> My assumption of using WITH which I think I proposed first (4th post in
> this thread) was to just blindly copy the most important "parts" logically
> related to a table, be it indices, materialized views, or triggers and
> enable / disable them as we wish. If no "WITH" is used, then we just get a
> table with nothing else. "WITH" will opt-in into that.
>
> Seeing us contemplating using "INCLUDING" and "EXCLUDING" on individual
> options makes me sad a little bit. I think we are over-engineering this. I
> just don't see a reasonable use-case where users would need to cherry-pick
> what they want and what not. Isn't that just too complicated? If a table
> being copied drifts away too much from the original one then users would be
> better off with creating a brand new table with CQL as they are used to,
> not dealing with "copying" at all. More we drift from what the original
> table was like, the less useful this feature is.
>
> On Wed, Oct 16, 2024 at 10:03 PM Dave Herrington <he...@rhinosource.com>
> wrote:
>
> Sorry that I overlooked the definition of the default in the CEP.  I did
> look for it but I didn’t see it.
>
> I think the default behavior you explained makes perfect sense & what one
> would expect.
>
> I like the flexibility of INCLUDING and EXCLUDING that you are considering.
>
> Would it make sense to use WITH for table options, which would make it
> easy (and less confusing IMHO) to override the defaults from the source
> table, then use INCLUDING/EXCLUDING for all non-table options such as
> constraints and indices?
>
> It seems this would be easier to document as well, as it could just point
> to the CREATE TABLE doc for the options, rather than trying to explain a
> bunch of keywords that map to table options.
>
> -Dave
>
> David A. Herrington II
> President and Chief Engineer
> RhinoSource, Inc.
>
> *Data Lake Architecture, Cloud Computing and Advanced Analytics.*
>
> www.rhinosource.com
>
>
> On Wed, Oct 16, 2024 at 7:57 PM guo Maxwell <cclive1...@gmail.com> wrote:
>
> To yifan :
> At the beginning of the period, I also thought about adding the keyword
> ALL, refer to pg
> <https://www.postgresql.org/docs/current/sql-createtable.html> , but  I
> give up when writing cep as I find that there may be not so many properties
> (only three) to copy for C* and
> It is possible to decide what is needed and what is not in a very simple
> cql, as our ALL is only three properties here. I want to keep it as simple
> as possible (based on the advice given by Benjamin), So I grouped
> the properties of the table into one category and expressed it with OPTION
> keyword.
>
> But if we are going to split the first keyword OPTION  to COMPRESSION
> 、COMPACTION、COMMENT and so on. I am +1 on adding ALL back as the properties
> are so many and it is simple to use ALL instead of
> list all properties. Besides I may change my keyword WITH to INCLUDING and
> adding another keyword EXCLUDING to flexibly copy table properties through
> simple sql statements, like using   1 not  2
>
>
>    1.  CREATE TABLE newTb like oldTb INCLUDING ALL EXCLUDING INDEXES AND
>    COMMENTS.
>    2.  CREATE TABLE newTb like oldTb INCLUDING COMPRESSION CONSTRAINTS
>    GENERATED IDENTITY STATISTICS STORAGE
>
> Conclusion: If there may be more keywords to consider in the future, such
> as more than 4 , I am +1 on adding ALL back .
>
> To Dave :
>    Default behavior is only copy column name, data type ,data mask , you
> can see more detail from  CEP-43
> <https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-43++Apache+Cassandra+CREATE+TABLE++LIKE>
> .
>
>
> Patrick McFadin <pmcfa...@gmail.com> 于2024年10月17日周四 06:43写道:
>
> +1 That makes much more sense in my experience.
>
> On Wed, Oct 16, 2024 at 12:12 PM Dave Herrington <he...@rhinosource.com>
> wrote:
>
> I'm coming at this with both a deep ANSI SQL background as well as CQL
> background.
>
> Defining the default behavior is the starting point.  What gets copied if
> we do "CREATE TABLE new_table LIKE original_table;" without a WITH clause?
>
> Then, you build on that with the specific WITH options.  WITH ALL catches
> everything.
>
> -Dave
>
> On Wed, Oct 16, 2024 at 11:16 AM Yifan Cai <yc25c...@gmail.com> wrote:
>
> "WITH ALL" seems to be a natural addition to the directives. What do you
> think about adding the fifth keyword ALL to retain all fields of the table
> schema?
>
> For instance, CREATE TABLE new_table LIKE original_table WITH ALL, it
> replicates options, indexes, triggers, constraints and any applicable kinds
> that are introduced in the future.
>
> - Yifan
>
> On Wed, Oct 16, 2024 at 7:46 AM guo Maxwell <cclive1...@gmail.com> wrote:
>
> Disscussed with Bernardo on slack,and +1 with his advice on adding a
> fourth keyword.
>
> The keyword would be  CONSTRAINTS , any more suggestion ?
>
> guo Maxwell <cclive1...@gmail.com>于2024年10月16日 周三上午9:55写道:
>
> Hi yifan,
> Thanks for bringing this up. The SELECT permission on the original table
> is needed. Mysql and PG all have mentioned this, and I also specifically
> noticed this in my code.
>
> I probably missed this in the cep documentation. 😅
>
> Yifan Cai <yc25c...@gmail.com> 于2024年10月16日周三 07:46写道:
>
> Thanks for creating the CEP! I think it is missing Bernardo's comment on
> "the need for read permissions on the source table".
>
> CreateTableStatement does not check the permissions outside of the
> enclosing keyspace. Having the SELECT permission on the original table is a
> requirement for CREATE TABLE LIKE.
>
> - Yifan
>
> On Sun, Sep 29, 2024 at 11:01 PM guo Maxwell <cclive1...@gmail.com> wrote:
>
> Hello, everyone ,
> I have finished the doc for CEP-43 for CREATE_TABLE_LIKE
> <https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-43++Apache+Cassandra+CREATE+TABLE++LIKE>
>  as
> said before, looking forward to your suggestions.
>
> Štefan Miklošovič <smikloso...@apache.org> 于2024年9月25日周三 03:51写道:
>
> I am sorry I do not follow what you mean, maybe an example would help.
>
> On Tue, Sep 24, 2024 at 6:18 PM guo Maxwell <cclive1...@gmail.com> wrote:
>
>
> If there are multiple schema information changes in one ddl statement,
> will there be schema conflicts in extreme cases?
> For example, our statement contains both table creation and index creation.
>
> guo Maxwell <cclive1...@gmail.com>于2024年9月24日 周二下午8:12写道:
>
> +1 on splitting this task  and adding the ability to copy tables through
> different keyspaces in the future.
>
> Štefan Miklošovič <smikloso...@apache.org> 于2024年9月23日周一 22:05写道:
>
> If we have this table
>
> CREATE TABLE ks.tb2 (
>     id int PRIMARY KEY,
>     name text
> );
>
> I can either specify name of an index on my own like this:
>
> CREATE INDEX name_index ON ks.tb2 (name) ;
>
> or I can let Cassandra to figure that name on its own:
>
> CREATE INDEX ON ks.tb2 (name) ;
>
> in that case it will name that index "tb2_name_idx".
>
> Hence, I would expect that when we do
>
> ALTER TABLE ks.to_copy LIKE ks.tb2 WITH INDICES;
>
> Then ks.to_copy table will have an index which is called
> "to_copy_name_idx" without me doing anything.
>
> For types, we do not need to do anything when we deal with the same
> keyspace. For simplicity, I mentioned that we might deal with the same
> keyspace scenario only for now and iterate on that in the future.
>
> On Mon, Sep 23, 2024 at 8:53 AM guo Maxwell <cclive1...@gmail.com> wrote:
>
> Hello everyone,
>
> Cep is being written, and I encountered some problems during the process.
> I would like to discuss them with you. If you read the description of this
> CASSANDRA-7662 <https://issues.apache.org/jira/browse/CASSANDRA-7662>, we
> will find that initially the original creator of this jira did not intend
> to implement structural copying of indexes, views, and triggers  only the
> column and its data type.
>
> However, after investigating some db related syntax and function
> implementation, I found that it may be necessary for us to provide some
> rich syntax to support the replication of indexes, views, etc.
>
> In order to support selective copy of the basic structure of the table
> (columns and types), table options, table-related indexes, views, triggers,
> etc. We need some new syntax, it seems that the syntax of pg is relatively
> comprehensive, it use the keyword INCLUDING/EXCLUDING to flexibly control
> the removal and retention of indexes, table information, etc. see pg
> create table like
> <https://www.postgresql.org/docs/8.1/sql-createtable.html> , the new
> created index name is different from the original table's index name , 
> seenewly
> copied index names are different from original
> <https://github.com/postgres/postgres/blob/master/doc/src/sgml/ref/create_table.sgml#L749>
> , the name is based on some rule.
> Mysql is relatively simple and copies columns and indexes by default. see 
> mysql
> create table like
> <https://dev.mysql.com/doc/refman/8.4/en/create-table-like.html> and the
> newly created index name is the same with the original table's index name.
>
> So for Casandra, I hope it can also support the information copy of index
> and even view/trigger. And I also hope to be able to flexibly decide which
> information is copied like pg.
>
> Besides, I think the copy can happen between different keyspaces. And UDT
> needs to be taken into account.
>
> But as we know the index/view/trigger name are all under keyspace level,
> so it seems that the newly created index name (or view name/ trigger name)
> must be different from the original tables' ,otherwise  names would clash .
>
> So regarding the above problem, one idea I have is that for newly created
> types, indexes and views under different keyspaces and the same keyspace,
> we first generate random names for them, and then we can add the ability of
> modifying the names(for types/indexes/views/triggers) so that users can
> manually change the names.
>
>
> guo Maxwell <cclive1...@gmail.com> 于2024年9月20日周五 08:06写道:
>
> No,I think still need some discuss on grammar detail after I finish the
> first version
>
> Patrick McFadin <pmcfa...@gmail.com>于2024年9月20日 周五上午2:24写道:
>
> Is this CEP ready for a VOTE thread?
>
> On Sat, Aug 24, 2024 at 8:56 PM guo Maxwell <cclive1...@gmail.com> wrote:
>
> Thank you for your replies, I will prepare a CEP later.
>
> Patrick McFadin <pmcfa...@gmail.com> 于2024年8月20日周二 02:11写道:
>
> +1 This is a CEP
>
> On Mon, Aug 19, 2024 at 10:50 AM Jon Haddad <j...@jonhaddad.com> wrote:
>
> Given the fairly large surface area for this, i think it should be a CEP.
>
> —
> Jon Haddad
> Rustyrazorblade Consulting
> rustyrazorblade.com
>
>
> On Mon, Aug 19, 2024 at 10:44 AM Bernardo Botella <
> conta...@bernardobotella.com> wrote:
>
> Definitely a nice addition to CQL.
>
> Looking for inspiration at how Postgres and Mysql do that may also help
> with the final design (I like the WITH proposed by Stefan, but I would
> definitely take a look at the INCLUDING keyword proposed by Postgres).
> https://www.postgresql.org/docs/current/sql-createtable.html
> https://dev.mysql.com/doc/refman/8.4/en/create-table-like.html
>
> On top of that, and as part of the interesting questions, I would like to
> add the permissions to the mix. Both the question about copying them over
> (with a WITH keyword probably), and the need for read permissions on the
> source table as well.
>
> Bernardo
>
>
> On Aug 19, 2024, at 10:01 AM, Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> BTW this would be cool to do as well:
>
> ALTER TABLE ks.to_copy LIKE ks.tb WITH INDICES;
>
> This would mean that if we create a copy of a table, later we can decide
> that we need indices too, so we might "enrich" that table with indices from
> the old one without necessarily explicitly re-creating them on that new
> table.
>
> On Mon, Aug 19, 2024 at 6:55 PM Štefan Miklošovič <smikloso...@apache.org>
> wrote:
>
> I think this is an interesting idea worth exploring. I definitely agree
> with Benjamin who raised important questions which needs to be answered
> first. Also, what about triggers?
>
> It might be rather "easy" to come up with something simple but it should
> be a comprehensive solution with predictable behavior we all agree on.
>
> If a keyspace of a new table does not exist we would need to create that
> one too before. For the simplicity, I would just make it a must to create
> it on same keyspace. We might iterate on that in the future.
>
> UDTs are created per keyspace so there is nothing to re-create. We just
> need to reference it from a new table, right?
>
> Indexes and MVs are interesting but in theory they might be re-created too.
>
> Would it be appropriate to use something like this?
>
> CREATE TABLE ks.tb_copy LIKE ks.tb WITH INDEXES AND VIEWS AND TRIGGERS
> ....
>
> Without "WITH" it would just copy a table with nothing else.
>
> On Mon, Aug 19, 2024 at 6:10 PM guo Maxwell <cclive1...@gmail.com> wrote:
>
> Hello, everyone:
> As  Jira CASSANDRA-7662
> <https://issues.apache.org/jira/browse/CASSANDRA-7662> has described , we
> would like to introduce a new grammer " CREATE TABLE LIKE "
> ,which  simplifies creating new tables duplicating the existing ones .
> The format may be like : CREATE TABLE <new_table> LIKE <old_table>
> Before I implement this function, do you have any suggestions on this?
>
> Looking forward to your reply!
>
>
>
>
> --
> -Dave
>
> David A. Herrington II
> President and Chief Engineer
> RhinoSource, Inc.
>
> *Data Lake Architecture, Cloud Computing and Advanced Analytics.*
>
> www.rhinosource.com
>
>
>
> --
> -Dave
>
> David A. Herrington II
> President and Chief Engineer
> RhinoSource, Inc.
>
> *Data Lake Architecture, Cloud Computing and Advanced Analytics.*
>
> www.rhinosource.com
>
>
>
> --
> -Dave
>
> David A. Herrington II
> President and Chief Engineer
> RhinoSource, Inc.
>
> *Data Lake Architecture, Cloud Computing and Advanced Analytics.*
>
> www.rhinosource.com
>
>
>
> --
> -Dave
>
> David A. Herrington II
> President and Chief Engineer
> RhinoSource, Inc.
>
> *Data Lake Architecture, Cloud Computing and Advanced Analytics.*
>
> www.rhinosource.com
>
>
>

Reply via email to