UDx Scalar Function
を作成して、行レベルで同等かどうかを確認できます。タプルをソートしたり、タプルからセットを作成することができます。 Pythonの例を紹介しますが、JAVAやC++でUDFを書くことを強くお勧めします。 (youtubeに完全デモ)
dbadmin=> select * from t1;
item1 | item2 | item3 | value
-------+-------+-------+-------
A | B | C | 3
C | D | E | 2
(2 rows)
dbadmin=> select * from t2;
item1 | item2 | item3
-------+-------+-------
C | A | B
C | F | E
(2 rows)
dbadmin=> select t1.* from t1, t2 where perm(t1.item1, t1.item2, t1.item3, t2.*);
item1 | item2 | item3 | value
-------+-------+-------+-------
A | B | C | 3
(1 row)
タプルの順序が重要な場合:
dbadmin=> select t2.*, t1.value from t1, t2
dbadmin-> where perm(t1.item1, t1.item2, t1.item3, t2.*);
item1 | item2 | item3 | value
-------+-------+-------+-------
C | A | B | 3
(1 row)
例えば(のVertica 8.xのための)パイソンに
バージョン1:
def processBlock(self, server_interface, arg_reader, res_writer):
while(True):
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of columns must be even")
s1, s2 = set(), set()
for i in range(cols):
if i < cols/2:
s1.add(arg_reader.getString(i))
else:
s2.add(arg_reader.getString(i))
res_writer.setBool(s1 == s2)
res_writer.next()
if not arg_reader.next():
break
バージョン2 :
def processBlock(self, server_interface, arg_reader, res_writer):
while(True):
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of cols must be even")
s = set()
for i in range(cols):
s.add(arg_reader.getString(i))
res_writer.setBool(len(s) == cols/2)
res_writer.next()
if not arg_reader.next():
break
全コード:ここ
import vertica_sdk
class perm(vertica_sdk.ScalarFunction):
def __init__(self):
pass
def setup(self, server_interface, col_types):
pass
def processBlock(self, server_interface, arg_reader, res_writer):
#server_interface.log("log msg")
while(True):
# Example of error checking best practices.
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of cols must be even")
s = set()
for i in range(cols):
s.add(arg_reader.getString(i))
res_writer.setBool(len(s) == cols/2)
res_writer.next()
if not arg_reader.next():
break
def destroy(self, server_interface, col_types):
pass
class perm_factory(vertica_sdk.ScalarFunctionFactory):
def createScalarFunction(self, srv):
return perm()
def getPrototype(self, srv_interface, arg_types, return_type):
arg_types.addAny()
return_type.addBool()
def getReturnType(self, srv_interface, arg_types, return_type):
return_type.addBool()
はありますか?この例ではNが3より大きいとしますか? –
理想的にはNは3より大きいでしょう – valenzio