У меня проблема с таблицей под названием «фильмы». Я обнаружил, что дата и название фильма указаны в колонке заголовков. Как показано на рисунке:
Я не знаю, как бороться с такими проблемами. Итак, я попытался поиграть с этим кодом, чтобы сделать его похожим на коды MySQL, но у меня все равно не получилось.
DataFrame(row.str.split(' ',-1).tolist(),columns = ['title','date'])
Как разделить его на две колонки (название, дата)?
@dylanthelion Это не вопрос SQL Server, насколько я знаю.
@Tim Biegeleisen Верно!
Если вы используете MySQL 8+, то мы можем попробовать использовать REGEXP_REPLACE
:
SELECT
REGEXP_REPLACE(title, '^(.*)\\s\\(.*$', '$1') AS title,
REGEXP_REPLACE(title, '^.*\\s\\((\\d+)\\)$', '$1') AS date
FROM yourTable;
Вот общий шаблон регулярного выражения, который может соответствовать вашим строкам заголовков:
^.*\s\((\d+)\)$
Объяснение:
^ from the start of the string
(.*)\s match and capture anything, up to the last space
\( match a literal opening parenthesis
(\d+) match and capture the year (any number of digits)
\) match a literal closing parenthesis
$ end of string
Спасибо, Тим, этот отличный ответ работает хорошо. Не могли бы вы объяснить, как работает ('^(.*)\\s\(.*$') и (*\\s\\((\\d+)\\)$')? вещи.
@MohammadAlamri Я добавил объяснение шаблона регулярного выражения. Если вы хотите исследовать регулярное выражение изолированно, я предлагаю использовать Регулярное выражение 101.
Я бы просто сделал:
select left(title, length(title) - 7) as title,
replace(right(title, 5) ,')', '') as year
Регулярные выражения кажутся излишними для этой логики.
В Hive для этого нужно использовать substr()
:
select substr(title, 1, length(title) - 7) as title,
substr(title, length(title) - 5, 4) as year
Ну, я пробовал, но это не сработало. даже я пытался внести некоторые изменения, но безрезультатно.
У меня возникла проблема: «Ошибка при компиляции инструкции: FAILED: SemanticException Line 0:-1 Недопустимая функция« слева »»
@МохаммадАламри . . . Ваш вопрос отмечен тегом MySQL, и эта функция определенно существует в MySQL. В Hive или MySQL вы можете использовать substr()
.
вы правы, вторая команда отлично работает после того, как я манипулировал числами. Лучший ответ. Спасибо
@МохаммадАламри . . . Вы нашли проблему с этим ответом? Я заметил, что ты не принял это.
Это не сработало идеально, но было немного близко. Поэтому я манипулировал числом, чтобы получить идеальный ответ. вы можете найти его как избранный.
После борьбы и поиска я смог создать эту команду, которая отлично работает.
select
translate(substr(title,0,length(title) -6) ,'', '') as title,
translate(substr(title, -5) ,')', '') as date
from movies;
Ответившим тоже спасибо!
Вы можете использовать STRING_SPLIT, если ваша версия SQLServer обновлена. Вы также можете использовать подстроку, если «дата» всегда является годом в скобках. К сожалению, я не думаю, что есть отличное решение. У вас не будет никакого эффективного использования индекса или UDF, которое я могу придумать для этой работы, и вам все равно придется что-то делать с вашими данными.