簡體   English   中英

Spark 3.0 和 Cassandra Spark / Python Conenctors:在寫入之前未創建表

[英]Spark 3.0 and Cassandra Spark / Python Conenctors: Table is not being created prior to write

我目前正在嘗試將我的應用程序升級到 Spark 3.0.1。 對於表創建,我使用 cassandra-driver(Python-Cassandra 連接器)刪除並創建了一個表。 然后我使用 spark-cassandra 連接器將數據幀寫入表中。 僅使用 spark-cassandra 連接器來創建和刪除表並沒有真正好的替代方法。

在 Spark 2.4 中,刪除-創建-寫入流程沒有問題。 但是在 Spark 3.0 中,應用程序似乎沒有特定的順序來做這些事情,通常在刪除和創建之前嘗試編寫。 我不知道如何確保首先刪除和創建表。 我知道刪除和創建確實發生,即使應用程序在寫入時出錯,因為當我通過 cqlsh 查詢 Cassandra 時,我可以看到表被刪除並重新創建。 關於 Spark 3.0 中這種行為的任何想法?

注意:由於架構發生變化,需要刪除並重新創建此特定表,而不是直接覆蓋。

要求的代碼片段:

        session = self._get_python_cassandra_session(self.env_conf, self.database)
        # build drop table query
        drop_table_query = 'DROP TABLE IF EXISTS {}.{}'.format(self.database, tablename)
        session.execute(drop_table_query)

        df, table_columns, table_keys = self._create_table_metadata(df, keys=keys)
        # build create query
        create_table_query = 'CREATE TABLE IF NOT EXISTS {}.{} ({} PRIMARY KEY({}), );'.format(self.database, tablename, table_columns, table_keys)
        # execute table creation
        session.execute(create_table_query)
        session.shutdown()


        # spark-cassandra connection options
        copts = _cassandra_cluster_spark_options(self.env_conf)
        # set write mode
        copts['confirm.truncate'] = overwrite
        mode = 'overwrite' if overwrite else 'append'
        # write dataframe to cassandra
        get_dataframe_writer(df, 'cassandra', keyspace=self.database, 
        table=tablename, mode=mode, copts=copts).save()

我最終建立了一個 time.sleep(5) 延遲,超時為 100 秒,以定期為表 ping Cassandra,然后寫入是否找到表。

在 Spark Cassandra Connector 3.0+ 中,您可以使用新功能 - 通過 Catalogs API 操作鍵空間和表。 您可以使用 Spark SQL 創建/更改/刪除鍵空間和表。 例如,您可以使用以下命令在 Cassandra 中創建一個表:

CREATE TABLE casscatalog.ksname.table_name (
  key_1 Int, 
  key_2 Int, 
  key_3 Int, 
  cc1 STRING, 
  cc2 String, 
  cc3 String, 
  value String) 
USING cassandra
PARTITIONED BY (key_1, key_2, key_3)
TBLPROPERTIES (
    clustering_key='cc1.asc, cc2.desc, cc3.asc',
    compaction='{class=SizeTieredCompactionStrategy,bucket_high=1001}'
)

正如您在此處看到的,您可以指定非常復雜的主鍵,還可以指定表選項。 casscatalog部分是鏈接到特定 Cassandra 集群的前綴(您可以同時使用多個) - 它是在您啟動 Spark 作業時指定的,例如:

spark-shell --packages com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 \
  --conf spark.sql.catalog.casscatalog=com.datastax.spark.connector.datasource.CassandraCatalog

更多示例可以在文檔中找到:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM