> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Intégrer ClickHouse à Amazon Glue

# Intégration d’Amazon Glue à ClickHouse et Spark

export const ClickHouseSupportedBadge = () => {
  return <div className="ClickHouseSupportedBadge">
            <div className="ClickHouseSupportedIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M1.30762 1.39073C1.30762 1.3103 1.37465 1.22986 1.46849 1.22986H2.64824C2.72868 1.22986 2.80912 1.29689 2.80912 1.39073V14.4886C2.80912 14.5691 2.74209 14.6495 2.64824 14.6495H1.46849C1.38805 14.6495 1.30762 14.5825 1.30762 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M4.2832 1.39073C4.2832 1.3103 4.35023 1.22986 4.44408 1.22986H5.62383C5.70427 1.22986 5.7847 1.29689 5.7847 1.39073V14.4886C5.7847 14.5691 5.71767 14.6495 5.62383 14.6495H4.44408C4.36364 14.6495 4.2832 14.5825 4.2832 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M7.25977 1.39073C7.25977 1.3103 7.3268 1.22986 7.42064 1.22986H8.60039C8.68083 1.22986 8.76127 1.29689 8.76127 1.39073V14.4886C8.76127 14.5691 8.69423 14.6495 8.60039 14.6495H7.42064C7.3402 14.6495 7.25977 14.5825 7.25977 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M10.2354 1.39073C10.2354 1.3103 10.3024 1.22986 10.3962 1.22986H11.576C11.6564 1.22986 11.7369 1.29689 11.7369 1.39073V14.4886C11.7369 14.5691 11.6698 14.6495 11.576 14.6495H10.3962C10.3158 14.6495 10.2354 14.5825 10.2354 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M13.2256 6.6057C13.2256 6.52526 13.2926 6.44482 13.3865 6.44482H14.5662C14.6466 6.44482 14.7271 6.51186 14.7271 6.6057V9.27354C14.7271 9.35398 14.6601 9.43442 14.5662 9.43442H13.3865C13.306 9.43442 13.2256 9.36739 13.2256 9.27354V6.6057Z" fill="currentColor" />
                </svg>
            </div>
            Compatible avec ClickHouse
        </div>;
};

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

<ClickHouseSupportedBadge />

[Amazon Glue](https://aws.amazon.com/glue/) est un service d’intégration de données serverless entièrement géré proposé par Amazon Web Services (AWS). Il simplifie la découverte, la préparation et la transformation des données pour l’analytics, le machine learning et le développement d’applications.

<div id="installation">
  ## Installation
</div>

Pour intégrer votre code Glue à ClickHouse, vous pouvez utiliser notre connecteur Spark officiel dans Glue de l’une des façons suivantes :

* Installer le connecteur ClickHouse Glue depuis AWS Marketplace (recommandé).
* Ajouter manuellement les JARs du connecteur Spark à votre job Glue.

<Tabs>
  <Tab title="AWS Marketplace">
    1. <h3 id="subscribe-to-the-connector">S’abonner au connecteur</h3>
       Pour accéder au connecteur dans votre compte, abonnez-vous au ClickHouse AWS Glue Connector depuis AWS Marketplace.

    2. <h3 id="grant-required-permissions">Accorder les autorisations requises</h3>
       Assurez-vous que le rôle IAM de votre job Glue dispose des autorisations nécessaires, comme indiqué dans le [guide](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs-job.html#getting-started-min-privs-connectors) sur les privilèges minimaux.

    3. <h3 id="activate-the-connector">Activer le connecteur et créer une connexion</h3>
       Vous pouvez activer le connecteur et créer une connexion directement en cliquant sur [ce lien](https://console.aws.amazon.com/gluestudio/home#/connector/add-connection?connectorName="ClickHouse%20AWS%20Glue%20Connector"\&connectorType="Spark"\&connectorUrl=https://709825985650.dkr.ecr.us-east-1.amazonaws.com/clickhouse/clickhouse-glue:1.0.0\&connectorClassName="com.clickhouse.spark.ClickHouseCatalog"), qui ouvre la page de création de connexion Glue avec les champs principaux préremplis. Donnez un nom à la connexion, puis cliquez sur create (inutile de fournir les informations de connexion ClickHouse à ce stade).

    4. <h3 id="use-in-glue-job">Utiliser dans un job Glue</h3>
       Dans votre job Glue, sélectionnez l’onglet `Job details`, puis développez la section `Advanced properties`. Dans la section `Connections`, sélectionnez la connexion que vous venez de créer. Le connecteur injecte automatiquement les JARs requis dans l’environnement d’exécution du job.

    <Image img="https://mintcdn.com/private-7c7dfe99/k4wNHsd_gyvah7Fr/images/integrations/data-ingestion/aws-glue/notebook-connections-config.webp?fit=max&auto=format&n=k4wNHsd_gyvah7Fr&q=85&s=6d6ebaacb208344b3c12e9d74176cd0d" size="md" alt="Glue Notebook connections config" force="true" width="877" height="742" data-path="images/integrations/data-ingestion/aws-glue/notebook-connections-config.webp" />

    <Note>
      Les JARs utilisés dans le connecteur Glue sont compilés pour `Spark 3.3`, `Scala 2` et `Python 3`. Veillez à sélectionner ces versions lors de la configuration de votre job Glue.
    </Note>
  </Tab>

  <Tab title="Manual Installation">
    Pour ajouter manuellement les JARs requis, procédez comme suit :

    1. Téléversez les JARs suivants dans un bucket S3 : `clickhouse-jdbc-0.6.X-all.jar` et `clickhouse-spark-runtime-3.X_2.X-0.8.X.jar`.
    2. Assurez-vous que le job Glue a accès à ce bucket.
    3. Dans l’onglet `Job details`, faites défiler vers le bas et développez le menu déroulant `Advanced properties`, puis indiquez le chemin des JARs dans `Dependent JARs path` :

    <Image img="https://mintcdn.com/private-7c7dfe99/k4wNHsd_gyvah7Fr/images/integrations/data-ingestion/aws-glue/dependent_jars_path_option.webp?fit=max&auto=format&n=k4wNHsd_gyvah7Fr&q=85&s=74f65422ba8e4c0d59ce3ada60dc2045" size="md" alt="Glue Notebook JAR path options" force="true" width="954" height="753" data-path="images/integrations/data-ingestion/aws-glue/dependent_jars_path_option.webp" />
  </Tab>
</Tabs>

<div id="example">
  ## Exemples
</div>

<Tabs>
  <Tab title="Scala">
    ```java theme={null}
    import com.amazonaws.services.glue.GlueContext
    import com.amazonaws.services.glue.util.GlueArgParser
    import com.amazonaws.services.glue.util.Job
    import com.clickhouseScala.Native.NativeSparkRead.spark
    import org.apache.spark.sql.SparkSession

    import scala.collection.JavaConverters._
    import org.apache.spark.sql.types._
    import org.apache.spark.sql.functions._

    object ClickHouseGlueExample {
      def main(sysArgs: Array[String]) {
        val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)

        val sparkSession: SparkSession = SparkSession.builder
          .config("spark.sql.catalog.clickhouse", "com.clickhouse.spark.ClickHouseCatalog")
          .config("spark.sql.catalog.clickhouse.host", "<your-clickhouse-host>")
          .config("spark.sql.catalog.clickhouse.protocol", "https")
          .config("spark.sql.catalog.clickhouse.http_port", "<your-clickhouse-port>")
          .config("spark.sql.catalog.clickhouse.user", "default")
          .config("spark.sql.catalog.clickhouse.password", "<your-password>")
          .config("spark.sql.catalog.clickhouse.database", "default")
          // for ClickHouse cloud
          .config("spark.sql.catalog.clickhouse.option.ssl", "true")
          .config("spark.sql.catalog.clickhouse.option.ssl_mode", "NONE")
          .getOrCreate

        val glueContext = new GlueContext(sparkSession.sparkContext)
        Job.init(args("JOB_NAME"), glueContext, args.asJava)
        import sparkSession.implicits._

        val url = "s3://{path_to_cell_tower_data}/cell_towers.csv.gz"

        val schema = StructType(Seq(
          StructField("radio", StringType, nullable = false),
          StructField("mcc", IntegerType, nullable = false),
          StructField("net", IntegerType, nullable = false),
          StructField("area", IntegerType, nullable = false),
          StructField("cell", LongType, nullable = false),
          StructField("unit", IntegerType, nullable = false),
          StructField("lon", DoubleType, nullable = false),
          StructField("lat", DoubleType, nullable = false),
          StructField("range", IntegerType, nullable = false),
          StructField("samples", IntegerType, nullable = false),
          StructField("changeable", IntegerType, nullable = false),
          StructField("created", TimestampType, nullable = false),
          StructField("updated", TimestampType, nullable = false),
          StructField("averageSignal", IntegerType, nullable = false)
        ))

        val df = sparkSession.read
          .option("header", "true")
          .schema(schema)
          .csv(url)

        // Write to ClickHouse
        df.writeTo("clickhouse.default.cell_towers").append()

        // Read from ClickHouse
        val dfRead = spark.sql("select * from clickhouse.default.cell_towers")
        Job.commit()
      }
    }
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    import sys
    from awsglue.transforms import *
    from awsglue.utils import getResolvedOptions
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job
    from pyspark.sql import Row

    ## @params: [JOB_NAME]
    args = getResolvedOptions(sys.argv, ['JOB_NAME'])

    sc = SparkContext()
    glueContext = GlueContext(sc)
    logger = glueContext.get_logger()
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)

    spark.conf.set("spark.sql.catalog.clickhouse", "com.clickhouse.spark.ClickHouseCatalog")
    spark.conf.set("spark.sql.catalog.clickhouse.host", "<your-clickhouse-host>")
    spark.conf.set("spark.sql.catalog.clickhouse.protocol", "https")
    spark.conf.set("spark.sql.catalog.clickhouse.http_port", "<your-clickhouse-port>")
    spark.conf.set("spark.sql.catalog.clickhouse.user", "default")
    spark.conf.set("spark.sql.catalog.clickhouse.password", "<your-password>")
    spark.conf.set("spark.sql.catalog.clickhouse.database", "default")
    spark.conf.set("spark.clickhouse.write.format", "json")
    spark.conf.set("spark.clickhouse.read.format", "arrow")
    # for ClickHouse cloud
    spark.conf.set("spark.sql.catalog.clickhouse.option.ssl", "true")
    spark.conf.set("spark.sql.catalog.clickhouse.option.ssl_mode", "NONE")

    # Create DataFrame
    data = [Row(id=11, name="John"), Row(id=12, name="Doe")]
    df = spark.createDataFrame(data)

    # Write DataFrame to ClickHouse
    df.writeTo("clickhouse.default.example_table").append()

    # Read DataFrame from ClickHouse
    df_read = spark.sql("select * from clickhouse.default.example_table")
    logger.info(str(df.take(10)))

    job.commit()
    ```
  </Tab>
</Tabs>
