Using Python 2 with Exasol 7.1.20 or later
This article describes how to continue to use Python 2.7 in Exasol 7.1.20 or later versions that do not support Python 2.
Python 2 has reached end of life and is no longer supported in Exasol, and we recommend that you switch to using Python 3 in all Python UDFs. This article describes a workaround method to continue to use Python 2.7 in Exasol 7.1.20 or later versions by using the old script language container.
These script language containers are provided as is
and are not maintained anymore.
Pre-update check
Run this script to output a list of the UDFs that likely use the built-in Python 2.
This script will detect most occurences of Python 2 usage in the UDFs. We cannot guarantee that all occurences are detected.
with
num_of_pairs as(
SELECT
p.system_value
, length(p.system_value)-length(replace(p.system_value, '=')) as num_of_pairs
FROM
exa_parameters p
WHERE
1=1
and p.parameter_name in ('SCRIPT_LANGUAGES')
)
, lang_pairs as(
SELECT
regexp_substr(nop.system_value, '[^ =]+=[^ ]+', 1, level) as pair_val
, nop.system_value
FROM
num_of_pairs nop
connect by
level <= nop.num_of_pairs
)
, parsed as(
SELECT
lp.*
, instr(lp.pair_val, '=') as eq_pos
, substr(lp.pair_val, 1, local.eq_pos-1) as alias_name
, substr(lp.pair_val, local.eq_pos + 1, length(lp.pair_val) - local.eq_pos) as alias_content
FROM
lang_pairs lp
)
select
case
when count(*) = 0 then 'You are not using the pre-shipped Python 2 in UDFs.'
else 'You have '||to_char(count(*))||' UDFs using the pre-shipped Python 2:
' || GROUP_CONCAT('"'||s.script_schema||'"."'||s.script_name||'"' separator '
')
end as check_results
FROM
parsed p
join exa_dba_scripts s
on upper(p.alias_name)=s.script_language
WHERE
1=1
and p.alias_content = 'builtin_python'
;
Update from 7.1.x To 7.1.20 or later
To use Python 2.7 with UDFs after updating from Exasol 7.1.x to Exasol 7.1.20 or later, you must change the SCRIPT_LANGUAGES
parameter to activate a script language container that supports Python 2.7. The new parameter value can be automatically or manually generated.
Automatic generation of the new SCRIPT_LANGUAGES
parameter value
-
Get the current value of the
SCRIPT_LANGUAGES
parameter and save the output in case you need to restore it.CopySELECT 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || system_value || ''';'
FROM EXA_PARAMETERS
WHERE PARAMETER_NAME='SCRIPT_LANGUAGES';Expected result (the example shows the default values - actual values may be different if the parameter has been changed):
CopyALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=builtin_python R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';
-
Run the following query before updating to 7.1.20:
Copywith minor_version as (
select CAST(SUBSTR(PARAM_VALUE,INSTR(PARAM_VALUE,'.',-1,1)+1) as INT) as minor_version
from EXA_METADATA
where PARAM_NAME='databaseProductVersion' and PARAM_VALUE like '7.1%'
),
container_name as (
select 'ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R' as container_name
from minor_version
where minor_version>=7
union all
select 'ScriptLanguages-release-standard-exasol-7.1.0-1.1.0' as container_name
from minor_version
where minor_version<7
),
num_of_pairs as(
SELECT
p.system_value,
length(p.system_value)-length(replace(p.system_value, '=')) as num_of_pairs
FROM exa_parameters p
WHERE p.parameter_name in ('SCRIPT_LANGUAGES')
),
lang_pairs as(
SELECT
regexp_substr(nop.system_value, '[^ =]+=[^ ]+', 1, level) as pair_val,
nop.system_value
FROM num_of_pairs nop
connect by level <= nop.num_of_pairs
),
parsed_lang_pairs as(
SELECT
instr(lp.pair_val, '=') as eq_pos,
substr(lp.pair_val, 1, local.eq_pos-1) as alias_name,
substr(lp.pair_val, local.eq_pos + 1, length(lp.pair_val) - local.eq_pos) as alias_content
FROM lang_pairs lp
),
new_alias_content as (
select
alias_name,
'localzmq+protobuf:///bfsdefault/default/EXAClusterOS/' || container_name || '/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/' || container_name || '/exaudf/exaudfclient' as alias_content
from container_name
join parsed_lang_pairs on true
where alias_content='builtin_python'
union all
select
alias_name,
alias_content
from parsed_lang_pairs
where alias_content<>'builtin_python'
),
new_system_value as (
select GROUP_CONCAT(alias_name || '=' || alias_content SEPARATOR ' ') as new_system_value
from new_alias_content
)
select 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || new_system_value || ''';' as command_text from new_system_value; -
Run the
ALTER SYSTEM
statement returned by the query. For example:CopyALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 PYTHON=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/exaudf/exaudfclient R=builtin_r';
We recommend that you test parameter changes using
ALTER SESSION
before making system-wide changes usingALTER SYSTEM
.
Manual generation of the new SCRIPT_LANGUAGES
parameter value
-
Get the current value of the
SCRIPT_LANGUAGES
parameter and save the output in case you need to restore it.CopySELECT 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || system_value || ''';'
FROM EXA_PARAMETERS
WHERE PARAMETER_NAME='SCRIPT_LANGUAGES';Expected result (the example shows the default values - actual values may be different if the parameter has been changed):
CopyALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=builtin_python R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';
-
Using the output from the query in the previous step, replace
builtin_python
withlocalzmq+protobuf:///bfsdefault/default/EXAClusterOS/<container_name>/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/<container_name>/exaudf/exaudfclient
Replace
<container_name>
in this string with the following value depending on which version you are upgrading from:Exasol 7.1.7 - 7.1.19 ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R Exasol 7.1.0 - 7.1.6 ScriptLanguages-release-standard-exasol-7.1.0-1.1.0 -
Run the updated
ALTER SYSTEM
statement after changing the values as described in the previous step. For example:CopyALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/<container_name>/exaudf/exaudfclient PYTHON3=builtin_python3 R=builtin_r JAVA=builtin_java';
We recommend that you test parameter changes using
ALTER SESSION
before making system-wide changes usingALTER SYSTEM
.
Fresh install of 7.1 or update from 7.0
If you do a fresh install of the latest Exasol 7.1 release or update from Exasol 7.0, you must install a pre-built script language container from GitHub and then update the SCRIPT_LANGUAGE
parameter to point to the container.
To learn how to install a script language container, see Adding New Packages to Existing Script Languages.
-
Download the latest version of the container that contained Python 2:
-
Control the checksum of the downloaded container.
-
Upload the container to BucketFS.
-
Run the following query to generate the
ALTER SYSTEM
command to update theSCRIPT_LANGUAGES
parameter.Replace the variables
<bucketfs_name>
,<bucket_name>
,<path_in_bucket>
, and<container_name>
in the query to match the path to the uploaded container in BucketFS.Copywith minor_version as (
select CAST(SUBSTR(PARAM_VALUE,INSTR(PARAM_VALUE,'.',-1,1)+1) as INT) as minor_version
from EXA_METADATA
where PARAM_NAME='databaseProductVersion' and PARAM_VALUE like '7.1%'
),
container_path as (
select '<bucketfs_name>/<bucket_name>/<path_in_bucket>/<container_name>' as container_path
),
num_of_pairs as(
SELECT
p.system_value,
length(p.system_value)-length(replace(p.system_value, '=')) as num_of_pairs
FROM exa_parameters p
WHERE p.parameter_name in ('SCRIPT_LANGUAGES')
),
lang_pairs as(
SELECT
regexp_substr(nop.system_value, '[^ =]+=[^ ]+', 1, level) as pair_val,
nop.system_value
FROM num_of_pairs nop
connect by level <= nop.num_of_pairs
),
parsed_lang_pairs as(
SELECT
instr(lp.pair_val, '=') as eq_pos,
substr(lp.pair_val, 1, local.eq_pos-1) as alias_name,
substr(lp.pair_val, local.eq_pos + 1, length(lp.pair_val) - local.eq_pos) as alias_content
FROM lang_pairs lp
),
new_alias_content as (
select
alias_name,
'localzmq+protobuf:///' || container_path || '/?lang=python#/buckets/' || container_path || '/exaudf/exaudfclient' as alias_content
from container_path
join parsed_lang_pairs on true
where alias_content='builtin_python'
union all
select
alias_name,
alias_content
from parsed_lang_pairs
where alias_content<>'builtin_python'
),
new_system_value as (
select GROUP_CONCAT(alias_name || '=' || alias_content SEPARATOR ' ') as new_system_value
from new_alias_content
)
select 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || new_system_value || ''';' as command_text from new_system_value; -
Run the
ALTER SYSTEM
statement returned by the query.We recommend that you test any parameter changes using
ALTER SESSION
before making system-wide changes usingALTER SYSTEM
.