

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Considerações e limitações para usar o Hudi no Amazon EMR
<a name="emr-hudi-considerations"></a>
+ **O campo de chave de registro não pode ser nulo nem estar em branco**: o campo especificado como o campo de chave de registro não pode ter valores `null` nem em branco.
+ **Esquema atualizado por padrão ao upsert e insert** — o Hudi fornece uma interface `HoodieRecordPayload` que determina como a entrada DataFrame e o conjunto de dados Hudi existente são mesclados para produzir um conjunto de dados novo e atualizado. O Hudi fornece uma implementação padrão dessa classe,`OverwriteWithLatestAvroPayload`, que sobrescreve os registros existentes e atualiza o esquema conforme especificado na entrada. DataFrame Para personalizar essa lógica a fim de implementar atualizações parciais e de mesclagem, é possível fornecer uma implementação da interface `HoodieRecordPayload` usando o parâmetro `DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY`.
+ **A exclusão requer um esquema**: ao excluir, você precisa especificar a chave de registro, a chave de partição e os campos de chave de pré-combinação. Outras colunas podem ficar `null` ou em branco, mas o esquema completo é necessário.
+ **Limitações das tabelas MoR**: as tabelas MoR não são compatíveis com pontos de salvamento. Você pode consultar tabelas MoR usando a visão otimizada para leitura ou a visão em tempo real (`{{tableName}}_rt`) do Spark SQL, Presto ou Hive. O uso da visão otimizada para leitura expõe apenas os dados do arquivo básico e não expõe uma visão mesclada dos dados básicos e de log.
+ **Hive**
  + Para registrar tabelas no metastore do Hive, o Hudi espera que o servidor Thrift do Hive esteja em execução na porta padrão `10000`. Se você substituir essa porta por uma porta personalizada, transmita a opção `HIVE_URL_OPT_KEY` conforme mostrado no exemplo a seguir.

    ```
    .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY, "jdbc:hive2://localhost:{{override-port-number}}
    ```
  + O tipo de dados `timestamp` no Spark é registrado como tipo de dados `long` no Hive, e não como o tipo `timestamp` do Hive.
+ **Presto**
  + O Presto não é compatível com a leitura de tabelas MoR em tempo real em versões do Hudi anteriores à 0.6.0. 
  + O Presto só oferece suporte a consultas de snapshots.
  + Para o Presto interpretar corretamente colunas de conjuntos de dados do Hudi, defina o valor `hive.parquet_use_column_names` como `true`.
    + Para definir o valor de uma sessão, execute o seguinte comando no shell Presto:

      ```
      set session hive.parquet_use_column_names=true
      ```
    + Para definir o valor no nível do cluster, use a classificação de configuração `presto-connector-hive` para definir `hive.parquet.use_column_names` como `true`, conforme mostrado no exemplo a seguir. Para obter mais informações, consulte [Configurar aplicações](emr-configure-apps.md).

      ```
      [
        {
          "Classification": "presto-connector-hive",
          "Properties": {
            "hive.parquet.use-column-names": "true"
          }
        }
      ]
      ```
+ **Índice do HBase**
  + A versão do HBase usada para *criar* o Hudi pode ser diferente da listada no Guia de versões do EMR. Para extrair as dependências corretas da sua sessão do Spark, acesse o comando a seguir.

    ```
    spark-shell \
    --jars /usr/lib/spark/external/lib/spark-avro.jar,/usr/lib/hudi/cli/lib/*.jar \
    --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
    --conf "spark.sql.hive.convertMetastoreParquet=false"
    ```
+ **Configurações para a melhor performance**: para EMR 7.3\+/Hudi 0.15\+, recomenda-se aos clientes definir essa configuração para reduzir a sobrecarga de serialização do Kryo: 

  ```
  --conf 'spark.kryo.registrator=org.apache.spark.HoodieSparkKryoRegistrar'
  ```
**nota**  
Se você estiver usando controle de acesso refinado (FGAC) no EMR Serverless, essa configuração não é necessária, pois os usuários devem usar em vez de. JavaSerializer KryoSerializer