Ejecuta operaciones de JOIN en intervalos con BigQuery

Cuando usas BigQuery, puedes ejecutar una consulta de JOIN en las variantes con los datos descritos por intervalos de región genómica o superposiciones. En esta página, se explica cómo usar una consulta de JOIN compleja para tomar una lista de genes humanos y hacer lo siguiente:

  • Encontrar los SNP poco frecuentes que se superponen en los genes
  • Encontrar 100,000 pares de bases en cada lado de un gen para las muestras de genomas completos

Se presentan tres consultas que muestran como BigQuery escala de acuerdo con distintos volúmenes de datos genómicos:

Los datos provienen de la tabla de Tute Genomics Annotation, de aproximadamente 9,000 millones de filas y del conjunto de datos de Platinum Genomes de Illumina. Si no estás familiarizado con estos conjuntos de datos, consulta estos vínculos:

Ejecuta JOIN en intervalos con una tabla intercalada

En este ejemplo, se utiliza una tabla de intervalo definida en la consulta, llamada intervals, y muestra cómo ejecutar una consulta de JOIN con una tabla que contiene variantes provenientes de Platinum Genomes de Illumina:

  1. Ve a la IU de BigQuery.

    Ir a la IU de BigQuery

  2. Haz clic en Redactar consulta.

  3. En el cuadro de Consulta nueva, ingresa la consulta siguiente:

    #standardSQL
    WITH
      --
      -- Retrieve the variants in this cohort, flattening by alternate bases and
      -- counting affected alleles.
      variants AS (
      SELECT
        REPLACE(reference_name, 'chr', '') as reference_name,
        start_position,
        end_position,
        reference_bases,
        alternate_bases.alt AS alt,
        (SELECT COUNTIF(gt = alt_offset+1) FROM v.call call, call.genotype gt) AS num_variant_alleles,
        (SELECT COUNTIF(gt >= 0) FROM v.call call, call.genotype gt) AS total_num_alleles
      FROM
        `bigquery-public-data.human_genome_variants.platinum_genomes_deepvariant_variants_20180823` v,
        UNNEST(v.alternate_bases) alternate_bases WITH OFFSET alt_offset ),
      --
      -- Define an inline table that uses five rows
      -- selected from silver-wall-555.TuteTable.hg19.
      intervals AS (
        SELECT * FROM UNNEST ([
        STRUCT<Gene STRING, Chr STRING, gene_start INT64, gene_end INT64, region_start INT64, region_end INT64>
        ('PRCC', '1', 156736274, 156771607, 156636274, 156871607),
        ('NTRK1', '1', 156785541, 156852640, 156685541, 156952640),
        ('PAX8', '2', 113972574, 114037496, 113872574, 114137496),
        ('FHIT', '3', 59734036, 61238131, 59634036, 61338131),
        ('PPARG', '3', 12328349, 12476853, 12228349, 12576853)
      ])),
      --
      -- JOIN the variants with the genomic intervals overlapping
      -- the genes of interest.
      --
      -- The JOIN criteria is complicated because the task is to see if
      -- an SNP overlaps an interval.  With standard SQL you can use complex
      -- JOIN predicates, including arbitrary expressions.
      gene_variants AS (
      SELECT
        reference_name,
        start_position,
        reference_bases,
        alt,
        num_variant_alleles,
        total_num_alleles
      FROM
        variants
      INNER JOIN
        intervals ON
        variants.reference_name = intervals.Chr
        AND intervals.region_start <= variants.start_position
        AND intervals.region_end >= variants.end_position )
      --
      -- And finally JOIN the variants in the regions of interest
      -- with annotations for rare variants.
    SELECT DISTINCT
      Chr,
      annots.Start AS Start,
      Ref,
      annots.Alt,
      Func,
      Gene,
      PopFreqMax,
      ExonicFunc,
      num_variant_alleles,
      total_num_alleles
    FROM
      `silver-wall-555.TuteTable.hg19` AS annots
    INNER JOIN
      gene_variants AS vars
    ON
      vars.reference_name = annots.Chr
      AND vars.start_position = annots.Start
      AND vars.reference_bases = annots.Ref
      AND vars.alt = annots.Alt
    WHERE
      -- Retrieve annotations for rare variants only.
      PopFreqMax <= 0.01
    ORDER BY
      Chr,
      Start;
    
  4. Haz clic en Ejecutar consulta. La consulta tarda aproximadamente diez segundos en ejecutarse y procesa alrededor de 334 GB de datos. Los resultados de la consulta identifican variantes poco frecuentes dentro de la cohorte que se superponen en las regiones de interés.

    Una consulta similar que use los datos de la fase 3 de 1,000 genomas tarda aproximadamente 90 segundos en ejecutarse y procesa alrededor de 3.38 TB de datos.

Uso de tablas materializadas

Cuando trabajas con macrodatos a gran escala, puedes materializar una tabla de intervalo y ejecutar una consulta de JOIN en la nueva tabla.

Ejecución de JOIN en intervalos con genes específicos

El siguiente ejemplo muestra cómo materializar una tabla de intervalo nueva que contenga una lista de genes específicos de la tabla silver-wall-555:TuteTable.hg19:

  1. Ve a la IU de BigQuery.

    Ir a la IU de BigQuery

  2. Crea un conjunto de datos mediante estos pasos:

    1. Haz clic en el ícono de flecha junto a tu proyecto de Google Cloud Platform en la navegación y haz clic en Crear conjunto de datos nuevo.

    2. Para ID de conjunto de datos, ingresa genomics.

    3. Deja el resto de la configuración predeterminada como está y haz clic en Aceptar.

  3. Crea la tabla de intervalo mediante los pasos siguientes:

    1. En BigQuery, haz clic en Redactar consulta.

    2. En el cuadro de Consulta nueva, ingresa la consulta siguiente, que materializa parte de la tabla silver-wall-555:TuteTable.hg19 en una nueva tabla de intervalo genomics.myIntervalTable:

      #standardSQL
      CREATE TABLE `genomics.myIntervalTable` AS (
      SELECT
        Gene,
        Chr,
        MIN(Start) AS gene_start,
        MAX(`End`) AS gene_end,
        MIN(Start)-100000 AS region_start,
        MAX(`End`)+100000 AS region_end
      FROM
        `silver-wall-555.TuteTable.hg19`
      WHERE
        Gene IN ('APC', 'ATM', 'BMPR1A', 'BRCA1', 'BRCA2', 'CDK4',
        'CDKN2A', 'CREBBP', 'EGFR', 'EP300', 'ETV6', 'FHIT', 'FLT3',
        'HRAS', 'KIT', 'MET', 'MLH1', 'NTRK1', 'PAX8', 'PDGFRA',
        'PPARG', 'PRCC', 'PRKAR1A', 'PTEN', 'RET', 'STK11',
        'TFE3', 'TGFB1', 'TGFBR2', 'TP53', 'WWOX')
      GROUP BY
        Chr,
        Gene );
      
      1. Haz clic en Ejecutar consulta.
  4. En el cuadro de Consulta nueva, ingresa la consulta siguiente.

    #standardSQL
    WITH
      --
      -- Retrieve the variants in this cohort, flattening by alternate bases and
      -- counting affected alleles.
      variants AS (
      SELECT
        REPLACE(reference_name, 'chr', '') as reference_name,
        start_position,
        end_position,
        reference_bases,
        alternate_bases.alt AS alt,
        (SELECT COUNTIF(gt = alt_offset+1) FROM v.call call, call.genotype gt) AS num_variant_alleles,
        (SELECT COUNTIF(gt >= 0) FROM v.call call, call.genotype gt) AS total_num_alleles
      FROM
        `bigquery-public-data.human_genome_variants.platinum_genomes_deepvariant_variants_20180823` v,
        UNNEST(v.alternate_bases) alternate_bases WITH OFFSET alt_offset ),
      --
      -- JOIN the variants with the genomic intervals overlapping
      -- the genes of interest.
      --
      -- The JOIN criteria is complicated because the task is to see if
      -- an SNP overlaps an interval.  With standard SQL you can use complex
      -- JOIN predicates, including arbitrary expressions.
      gene_variants AS (
      SELECT
        reference_name,
        start_position,
        reference_bases,
        alt,
        num_variant_alleles,
        total_num_alleles
      FROM
        variants
      INNER JOIN
        `genomics.myIntervalTable` AS intervals ON
        variants.reference_name = intervals.Chr
        AND intervals.region_start <= variants.start_position
        AND intervals.region_end >= variants.end_position )
      --
      -- And finally JOIN the variants in the regions of interest
      -- with annotations for rare variants.
    SELECT DISTINCT
      Chr,
      annots.Start AS Start,
      Ref,
      annots.Alt,
      Func,
      Gene,
      PopFreqMax,
      ExonicFunc,
      num_variant_alleles,
      total_num_alleles
    FROM
      `silver-wall-555.TuteTable.hg19` AS annots
    INNER JOIN
      gene_variants AS vars
    ON
      vars.reference_name = annots.Chr
      AND vars.start_position = annots.Start
      AND vars.reference_bases = annots.Ref
      AND vars.alt = annots.Alt
    WHERE
      -- Retrieve annotations for rare variants only.
      PopFreqMax <= 0.01
    ORDER BY
      Chr,
      Start;
    
  5. Haz clic en Ejecutar consulta. La consulta tarda aproximadamente diez segundos en ejecutarse y procesa alrededor de 334 GB de datos. Los resultados de la consulta identifican variantes poco frecuentes dentro de la cohorte que se superponen en las regiones de interés.

    Una consulta similar que use los datos de la fase 3 de 1,000 genomas tarda aproximadamente 90 segundos en ejecutarse y procesa alrededor de 3.38 TB de datos.

Ejecución de JOIN en intervalos con genes aleatorios

En el siguiente ejemplo, se muestra cómo ejecutar un JOIN de intervalos en una tabla materializada que contiene 250 genes seleccionados de forma aleatoria a partir de la tabla silver-wall-555:TuteTable.hg19:

  1. Ve a la IU de BigQuery.

    Ir a la IU de BigQuery

  2. Crea un conjunto de datos mediante estos pasos:

    1. Haz clic en el ícono de flecha junto a tu proyecto de Google Cloud Platform en la navegación y haz clic en Crear conjunto de datos nuevo.

    2. Para ID de conjunto de datos, ingresa genomics.

    3. Deja el resto de la configuración predeterminada como está y haz clic en Aceptar.

  3. Crea la tabla de intervalo mediante los pasos siguientes:

    1. En BigQuery, haz clic en Redactar consulta.

    2. En el cuadro de Consulta nueva, ingresa la consulta siguiente, que materializa parte de la tabla silver-wall-555:TuteTable.hg19 en una nueva tabla de intervalo genomics.randomGenesIntervalTable:

      #standardSQL
      CREATE TABLE `genomics.randomGenesIntervalTable` AS (
      SELECT
        Gene,
        Chr,
        MIN(Start) AS gene_start,
        MAX(`End`) AS gene_end,
        MIN(Start) - 100000 AS region_start,
        MAX(`End`) + 100000 AS region_end
      FROM
        `silver-wall-555.TuteTable.hg19`
      WHERE
        Gene IN (SELECT Gene FROM `silver-wall-555.TuteTable.hg19` GROUP BY Gene LIMIT 250)
      GROUP BY
        Chr,
        Gene );
      
      1. Haz clic en Ejecutar consulta.
  4. En el cuadro de Consulta nueva, ingresa la consulta siguiente.

    #standardSQL
    WITH
      --
      -- Retrieve the variants in this cohort, flattening by alternate bases and
      -- counting affected alleles.
      variants AS (
      SELECT
        REPLACE(reference_name, 'chr', '') as reference_name,
        start_position,
        end_position,
        reference_bases,
        alternate_bases.alt AS alt,
        (SELECT COUNTIF(gt = alt_offset+1) FROM v.call call, call.genotype gt) AS num_variant_alleles,
        (SELECT COUNTIF(gt >= 0) FROM v.call call, call.genotype gt) AS total_num_alleles
      FROM
        `bigquery-public-data.human_genome_variants.platinum_genomes_deepvariant_variants_20180823` v,
        UNNEST(v.alternate_bases) alternate_bases WITH OFFSET alt_offset ),
      --
      -- JOIN the variants with the genomic intervals overlapping
      -- the genes of interest.
      --
      -- The JOIN criteria is complicated because the task is to see if
      -- an SNP overlaps an interval.  With standard SQL you can use complex
      -- JOIN predicates, including arbitrary expressions.
      gene_variants AS (
      SELECT
        reference_name,
        start_position,
        reference_bases,
        alt,
        num_variant_alleles,
        total_num_alleles
      FROM
        variants
      INNER JOIN
        `genomics.randomGenesIntervalTable` AS intervals ON
        variants.reference_name = intervals.Chr
        AND intervals.region_start <= variants.start_position
        AND intervals.region_end >= variants.end_position )
      --
      -- And finally JOIN the variants in the regions of interest
      -- with annotations for rare variants.
    SELECT DISTINCT
      Chr,
      annots.Start AS Start,
      Ref,
      annots.Alt,
      Func,
      Gene,
      PopFreqMax,
      ExonicFunc,
      num_variant_alleles,
      total_num_alleles
    FROM
      `silver-wall-555.TuteTable.hg19` AS annots
    INNER JOIN
      gene_variants AS vars
    ON
      vars.reference_name = annots.Chr
      AND vars.start_position = annots.Start
      AND vars.reference_bases = annots.Ref
      AND vars.alt = annots.Alt
    WHERE
      -- Retrieve annotations for rare variants only.
      PopFreqMax <= 0.01
    ORDER BY
      Chr,
      Start;
    
  5. Haz clic en Ejecutar consulta. La consulta tarda aproximadamente diez segundos en ejecutarse y procesa alrededor de 334 GB de datos. Los resultados de la consulta identifican variantes poco frecuentes dentro de la cohorte que se superponen en las regiones de interés.

    Una consulta similar que use los datos de la fase 3 de 1,000 genomas tarda aproximadamente 90 segundos en ejecutarse y procesa alrededor de 3.38 TB de datos.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Cloud Life Sciences