0

カサンドラは初めてです。Datastax の Cassandra PHP ドライバーを使用しています。複数の挿入を含むバッチ ステートメントを作成しようとしています。テーブル モデルを考えると、次のようになります。

CREATE TABLE real_time_log (
  du_id int,
  tag_id int,
  status int,
  time_stamp bigint,
  value float,
  PRIMARY KEY ((du_id, tag_id), status, time_stamp)
) 

次の値を 2 つの方法で挿入しようとしています。

$batch = new Cassandra\BatchStatement();
$stmt = $this->cassandraDb->prepare('insert into real_time_log'
         . ' (du_id, tag_id, status, time_stamp, value) '
         . 'VALUES (?, ?, ?, ?, ?)');
foreach ($curData as $cData) {
    $values = explode(',', $cData);
    $stmtValues = array(
        'du_id' => 11111,
        'tag_id' => 22222,
        'status' => (int) $values[2],
        'time_stamp' => new Cassandra\Bigint($values[0]),
        'value' => (double) $values[1]
    );
    $batch->add($stmt, $stmtValues);
}
$this->cassandraDb->executeAsync($batch);

これによりエラーが発生します。

PHP Fatal error:  Uncaught exception 'Cassandra\Exception\InvalidArgumentException' with message 'Invalid value type'

その間、私は準備されたステートメントなしでより簡単なアプローチを試みました:

$batch = new Cassandra\BatchStatement();
foreach ($curData as $cData) {
    $values = explode(',', $cData);
    $stmtValues = array(
        11111,
        22222,
        (int) $values[2],
        new Cassandra\Bigint($values[0]),
        (double) $values[1]
     );
     $batch->add(new Cassandra\SimpleStatement('insert into real_time_log'
                        . ' (du_id, tag_id, status, time_stamp, value) '
                        . 'VALUES (' . implode(',', $stmtValues) . ')'));
 }
 $this->cassandraDb->executeAsync($batch);

この方法ですべてが機能しますが、確実に遅くなります。私が行っている準備済みステートメントのアプローチの何が問題なのか、誰かが説明できるでしょうか?

前もって感謝します。

4

2 に答える 2

1

一見すると、うまくいくように見えます - 明示的にfloat( に変更)(double) $values[1]を渡してみましたnew Cassandra\Float($values[1])か?

于 2015-10-23T04:03:28.940 に答える